2009-07-24 21 views
0

Ich muss ein C/C++ - Doppel in ein 64-Bit-Zweierkomplement konvertieren, wobei der Radix-Punkt bei Bit 19 (inklusive) ist.Numerische Konvertierung in C/C++

Dies bedeutet, dass für das Format I zu

  • 0x0000 0000 0010 0000 konvertieren will die Nummer 1
  • 0xFFFF FFFF FFF0 0000 ist die Zahl -1
  • 0x0000 0000 0000 0001 0,95 x 10^-6
  • 0xFFFF FFFF FFFF FFFF ist -0.95 x 10^-6

ich bisher habe, obwohl über die modf Funktion aus der C unter Verwendung von Standard-Bibliothek, aber das deckt meine Bedürfnisse nicht wirklich. Ich habe mir in Boost auch einige Klassen für die Typumwandlung angesehen, aber ich konnte dort auch nicht die richtige Lösung finden. Kennt jemand eine Bibliothek oder eine einfache Möglichkeit, diese Konvertierung durchzuführen? Vielleicht kann jemand, der mit Boost vertrauter ist, mir in die richtige Richtung weisen.

Wenn this hilft, hier ist eine Dokumentation, wie Doppelgänger gespeichert werden.

Edit:

Ich habe eine Follow-up-Frage, das ist wirklich für mein eigenes Interesse ist. Was ist "Radix"? Hier ist es wie ein Dezimalpunkt. Aber das einzige andere Mal, dass ich den Begriff Radix gehört habe, war, als ich etwas über die Discrete Fast Fourier Transformation gelernt habe. Wenn ich mich richtig erinnere, ist die Radix-II-Methode schnell, weil es weniger Multiplikationen gibt, die die DFT berechnen müssen.

Antwort

4

Dies sollte die Ergebnisse, die Sie wollen:

double d = someValue(); 
int64_t fixed_point = static_cast<int64_t>(d * (1024*1024)); 
+0

ich lieber „d schreiben * 0x100000 ", da es deutlicher macht, wo Sie das Radix platzieren. Persönlicher Geschmack aber. – VoidPointer

+0

Guter Punkt. Im wirklichen Leben erwarte ich, dass es an mehr als einem Ort verwendet wird, und sollte wahrscheinlich eine benannte Konstante sein. Aber für 44,20 Bit Fixpunkt ist ein Hex-Literal wahrscheinlich klarer als Dezimal. –

1

Multiplizieren mit 2^20 und dann konvertieren, um die Integer-Typ Sie (wahrscheinlich long long) Ziel