Question

Dans mon programme C ++, je dois tirer un flotteur 64 bits à partir d'une séquence d'octets externe. Est-il possible d'assurer, à la compilation, que les doubles sont 64 bits? Y at-il un autre type que je devrais utiliser pour stocker les données à la place?

Edit:. Si vous lisez ceci et en fait à la recherche d'un moyen d'assurer le stockage dans le format IEEE 754, un coup d'oeil à la réponse ci-dessous Adam Rosenfield

Était-ce utile?

La solution

Une amélioration par rapport aux autres réponses (qui supposent char est de 8 bits, la norme ne garantit pas ..). Serait comme ceci:

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

ou

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

Vous pouvez trouver CHAR_BIT défini dans <limits.h> ou <climits>.

Autres conseils

En C99, vous pouvez simplement vérifier que est défini le symbole de préprocesseur __STDC_IEC_559__. Dans ce cas, vous êtes assuré qu'un double sera une valeur de 8 octets représenté au format IEEE 754 (également connu sous 60559 IEC). Voir la norme C99, annexe F. Je ne sais pas si ce symbole est disponible en C ++, cependant.

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

Vous pouvez vérifier les constantes prédéfinies __DBL_DIG__ (doit être 15), __DBL_MANT_DIG__ (doit être 53), __DBL_MAX_10_EXP__ (devrait être 308), __DBL_MAX_EXP__ (devrait être 1024), __DBL_MIN_10_EXP (devrait être -307), et __DBL_MIN_EXP__ ( devrait être -1021). Ceux-ci devraient être disponibles dans toutes les saveurs de C et C ++.

Vérifier std::numeric_limits< double >::is_iec559 si vous avez besoin de savoir si votre implémentation C ++ prend en charge les doubles standards. Cela garantit non seulement que le nombre total de bits est de 64, mais aussi la taille et la position de tous les champs à l'intérieur du double.

Je ne pense pas que vous devriez vous concentrer sur la « taille brute » de votre double (qui est généralement 80 bits, et non 64 bits), mais plutôt sur sa précision.

Merci à numeric_limits :: digits10 cela est assez facile.

Vous pouvez utiliser le href="http://www.boost.org/doc/libs/1_38_0/doc/html/boost_staticassert.html" Boost assertions statiques faire. Regardez le utilisation à périmètre d'espace de noms par exemple.

La solution sans impulsion est de définir la matrice comme si

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

Si la double ne sont pas 64 bits alors la volonté de code ressemble

char a[0];

qui est une erreur de temps de compilation. Il suffit de mettre le commentaire approprié près de cette instruction.

Voir cette post pour un problème similaire et une compilation non-boost affirmation de temps appelé CCASSERT.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top