Frage

In meinem C ++ Programm, ich brauche ein 64-Bit-Float von einer externen Byte-Sequenz zu ziehen. Gibt es eine Möglichkeit, bei der Kompilierung-Zeit, um sicherzustellen, dass Doppelzimmer 64 Bit? Gibt es eine andere Art, ich sollte stattdessen die Daten speichern verwenden?

Edit:. Wenn Sie diese Zeilen lesen und wirklich nach einem Weg sucht Lagerung im IEEE 754-Format zu gewährleisten, hat unten einen Blick auf Adam Rosenfield Antwort

War es hilfreich?

Lösung

Eine Verbesserung gegenüber den anderen Antworten (die davon ausgehen, ein Zeichen ist 8 Bit, wird der Standard dies nicht garantieren ..). Wäre so aussehen:

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

oder

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

Sie können CHAR_BIT in <limits.h> oder <climits> definiert finden.

Andere Tipps

In C99, können Sie einfach überprüfen, ob das Präprozessorsymbol __STDC_IEC_559__ definiert ist. Wenn ja, dann sind Sie garantiert, dass ein double wird einen 8-Byte-Wert mit IEEE 754-Format (auch als IEC 60559 bekannt) vertreten sein. Siehe den C99-Standard, Anhang F. Ich bin mir nicht sicher, ob dieses Symbol in C verfügbar ist ++, though.

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

Alternativ können Sie die vordefinierte Konstanten __DBL_DIG__ überprüfen (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 Versionen von C und C ++ zur Verfügung.

std::numeric_limits< double >::is_iec559 Überprüfen Sie, ob Sie, ob Ihre C ++ Implementierung Standard-Doppelzimmer müssen wissen, unterstützt. Dies garantiert nicht nur, dass die Gesamtzahl der Bits 64, sondern auch die Größe und Position aller Felder im Innern des Doppels.

Ich glaube nicht, dass Sie auf der „raw Größe“ von Ihrem Doppel konzentrieren sollen (was in der Regel 80 Bit ist, nicht 64-Bit), sondern auf seiner Präzision.

Dank numeric_limits :: digits10 das ist ziemlich einfach.

Sie können die statische Behauptungen Erhöhung mach das. Schauen Sie sich die Verwendung bei Namespacebereich Beispiel.

Die Lösung ohne boost ist das Array so wie

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

Wenn die Doppel nicht 64 Bit ist dann der Code sieht aus wie

char a[0];

, die ein Kompilierung Fehler. Einfach den entsprechenden Kommentar in der Nähe von dieser Anweisung.

Siehe dieser Beitrag für ein ähnliches Problem und eine Nicht-Boost-Kompilierung Zeit Behauptung genannt CCASSERT.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top