Assurer des doubles C sont de 64 bits
-
09-09-2019 - |
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
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.