28 Stimmen

Sicherstellen, dass C++-Doppelgänger 64 Bit sind

In meinem C++-Programm muss ich eine 64-Bit-Fließkommazahl aus einer externen Bytefolge ziehen. Gibt es eine Möglichkeit, zur Kompilierzeit sicherzustellen, dass Doubles 64 Bit sind? Gibt es einen anderen Typ, den ich stattdessen zum Speichern der Daten verwenden sollte?

Edit: Wenn Sie dies lesen und eigentlich auf der Suche nach einer Möglichkeit, die Speicherung im IEEE-754-Format zu gewährleisten, lesen Sie bitte die Antwort von Adam Rosenfield weiter unten.

39voto

Adam Rosenfield Punkte 373807

In C99 können Sie einfach prüfen, ob das Präprozessorsymbol __STDC_IEC_559__ definiert ist. Wenn dies der Fall ist, können Sie sicher sein, dass ein double ist ein 8-Byte-Wert, der im IEEE-754-Format (auch bekannt als IEC 60559) dargestellt wird. Siehe den C99-Standard, Anhang F. Ich bin allerdings nicht sicher, ob dieses Symbol in C++ verfügbar ist.

#ifndef __STDC_IEC_559__
#error "Requires IEEE 754 floating point!"
#endif

Alternativ können Sie auch die vordefinierten Konstanten prüfen __DBL_DIG__ (sollte 15 sein), __DBL_MANT_DIG__ (sollte 53 sein), __DBL_MAX_10_EXP__ (sollte 308 sein), __DBL_MAX_EXP__ (sollte 1024 sein), __DBL_MIN_10_EXP__ (sollte -307 sein), und __DBL_MIN_EXP__ (sollte -1021 sein). Diese sollten in allen Varianten von C und C++ verfügbar sein.

15voto

Evan Teran Punkte 83711

Eine Verbesserung gegenüber den anderen Antworten (die davon ausgehen, dass ein Zeichen aus 8 Bits besteht, was der Standard nicht garantiert ). Sie würde so aussehen:

char a[sizeof(double) * CHAR_BIT == 64];

oder

BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64);

Sie finden CHAR_BIT definiert in <limits.h> ou <climits> .

14voto

MSalters Punkte 166675

Siehe std::numeric_limits< double >::is_iec559 wenn Sie wissen müssen, ob Ihre C++-Implementierung Standard-Doubles unterstützt. Dies garantiert nicht nur, dass die Gesamtzahl der Bits 64 beträgt, sondern auch die Größe und Position aller Felder innerhalb des Doubles.

6voto

Edouard A. Punkte 6114

Ich glaube nicht, dass Sie sich auf die "Rohgröße" Ihres Double konzentrieren sollten (die in der Regel 80 Bit und nicht 64 Bit beträgt), sondern eher auf seine Präzision.

Dank numeric_limits::digits10 ist dies recht einfach.

5voto

Mykola Golubyev Punkte 54937

Die Lösung ohne Boost ist, das Array wie folgt zu definieren

char a[ 8 == sizeof(double) ];

Wenn der Double nicht 64 Bit ist, sieht der Code wie folgt aus

char a[0];

was ein Kompilierzeitfehler ist. Fügen Sie einfach den entsprechenden Kommentar zu dieser Anweisung hinzu.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X