Dette er ikke så meget en specifik C/C++opgave, men derimod en opgave hvor du skal tænke lidt.
Når man generelt har med kommatal at gøre i andre baser end 10, f.eks. 16, skal man bruge det der bliver kaldt, repeated multiplication. Først og fremmest skal du have delt din float værdi op. Den "højere" del og den "lavere" del.
18.39
=
18 (Højere del) | .39 (Lavere del)
Derefter starter du ud med at tage kommatallet (0.39) og ganger det med 16, der er vores base, da det er hexadecimal. Derefter tager man den "højere" del, og konvertere til det enkelt hexadecimalnummer. I vores tilfælde bliver dette 6, og vores "lavere" del, vi skal bruge er 0.24. Dette fortsætter man med indtil den "lavere" del er 0, eller hvis det er et "uendeligt" kommatal, stopper man når man mener det er nok. Her udfører vi med 0.39:
0.39 * 16 = 06.24 => .6
0.24 * 16 = 03.84 => .63
0.84 * 16 = 13.44 => .63D
0.44 * 16 = 07.04 => .63D7
0.04 * 16 = 00.64 => .63D70 (0 = Vi stopper)
På denne måde har vi fået selve kommatallet, af vores float-nummer. Nu mangler vi bare den resterende del, 18.
Tallet 18, kan dog gøres på den "normale" måde, uden alt muligt. Så vi tager den tradionelle dec-to-hex-metode, som jeg har valgt at kalde den. Her tager vi tallet, dividere med 16, vores base (hex), så tager vi værdien, og gemmer. Og efterladenskaberne, hvis der blev noget tilovers, hvis det ikke var et lige tal, konvertere vi til hex, og bruger det i vores resultat.
18 / 16 = 1, [2] => 2
01 / 16 = 0, [1] => 12
Dette var selvfølgelig to små tal, men resultatet er rigtigt. Nu skal vi bare sætte dem sammen.
12 += .63D70
=
12.63D70 (Dette er vores resultat)
Nu har du grundidéen til at gøre det i C/C++.
Hvis du gør det i C++, ville jeg foretrækker først at lægge floating-typen i en stringstream og derefter videre til en string. Strengen deler du op, ligesom vi har gjort, og derefter bliver den "højere" del konverteret til integer, og vores "lavere" del bliver konverteret til floating-typen.
// Eksempel på float -> string, ved brug af stringstream
#include <sstream>
#include <string>
// ...
float myFloatingValue = 18.39;
std::string myStringedValue;
std::stringstream myStringStream;
myStringStream << myFloatingValue;
myStringStream >> myStringedValue; // "18.39"
// Her kan du arbejde med strengen
Håber dette gav dig stof nok til at komme igang!