Je cherchais pour voir s'il existe un type standard similaire à uint32_t
qui correspondait toujours à un type intégral non signé 32 bits mais je n'en trouvais aucun.
La taille de float
est-elle toujours de 4 octets sur toutes les plates-formes?
La taille de double
est-elle toujours 8?
L'une ou l'autre norme dit-elle quelque chose à ce sujet?
Je veux m'assurer que ma taille est toujours la même sur toutes les plateformes (x86 et x64), donc j'utilise des types int standard, mais je n'ai pas trouvé de typedef similaire pour float
et double
.
Extrait de la norme C99, annexe normative F (La norme C++ - ne mentionne pas explicitement cette annexe, bien qu'elle inclue toutes les fonctions affectées sans changement par référence. De plus, les types doivent correspondre pour des raisons de compatibilité.):
Arithmétique à virgule flottante CEI 60559
F.1 Introduction
1 La présente annexe spécifie la prise en charge du langage C pour la norme à virgule flottante IEC 60559. La norme à virgule flottante IEC 60559 est spécifiquement l'arithmétique à virgule flottante binaire pour les systèmes à microprocesseur, deuxième édition (CEI 60559: 1989), précédemment désignée IEC 559: 1989 et en tant que norme IEEE pour les virgules flottantes binaires. Arithmétique (ANSI/IEEE 754−1985). La norme IEEE pour l'arithmétique à virgule flottante indépendante de Radix (ANSI/IEEE 854−1987) généralise la norme binaire pour supprimer les dépendances sur la longueur de radix et de mot. IEC 60559 fait généralement référence à la norme à virgule flottante, comme dans IEC opération 60559, IEC format 60559, etc. Une implémentation qui définit
__STDC_IEC_559__
Doit être conforme aux spécifications dans la présente annexe.356) Lorsqu'une liaison entre le langage C et IEC 60559 est indiquée, le comportement spécifié par IEC 60559 est adopté par référence, sauf indication contraire. Étant donné que l'infini négatif et positif sont représentables dans les formats IEC 60559, tous les nombres réels se situent dans la plage de valeurs représentables.
Donc, incluez <math.h>
(Ou en C++ peut-être <cmath>
), Et testez __STDC_IEC_559__
.
Si la macro est définie, non seulement les types sont mieux spécifiés (float
étant 32 bits et double
étant 64 bits entre autres), mais aussi le comportement des opérateurs intégrés et des fonctions standard est plus spécifié.
L'absence de macro ne donne aucune garantie.
Pour x86 et x86_64 (AMD64), vous pouvez vous fier aux types float
et double
conformes à la norme CEI-60559, bien que les fonctions qui les utilisent et les opérations qui y sont associées ne le soient pas.
Ne dit rien sur la taille.
3.9.1.8
Il existe trois types de virgule flottante: float, double et long double. Le type double fournit au moins autant de précision que float, et le type long double fournit au moins autant de précision que double. L'ensemble des valeurs du type float est un sous-ensemble de l'ensemble des valeurs du type double; l'ensemble des valeurs du type double est un sous-ensemble de l'ensemble des valeurs du type long double. La représentation des valeurs des types à virgule flottante est définie par l'implémentation. Les types intégraux et flottants sont collectivement appelés types arithmétiques. Les spécialisations du modèle standard std :: numeric_limits (18.3) doivent spécifier les valeurs maximale et minimale de chaque type arithmétique pour une implémentation.
La norme C++ ne dit rien, mais dans la plupart des plates-formes, C++ utilise la norme de précision simple/double d'IEEE, qui définit la précision simple comme 4 octets et la double précision comme 8 octets.
http://en.wikipedia.org/wiki/Single-precision_floating-point_formathttp://en.wikipedia.org/wiki/Double-precision_floating-point_format
Je ne suis pas sûr des exceptions pour ces cas.
Comme les opérations en virgule flottante sont implémentées à un bas niveau par les CPU, la norme C++ n'impose pas de taille pour un float
, double
ou long double
. Tout ce qu'il dit, c'est que l'ordre que je leur ai spécifié est dans un ordre de précision égal ou croissant.
Le mieux est d'utiliser static_assert
, sizeof
, typedef
et #define
soigneusement afin de définir les types de virgule flottante multiplateforme.
Dans le cas de X86, même si vous utilisez des nombres à simple et double précision IEEE, les calculs internes sont affectés par un mot de contrôle à virgule flottante (FCW). Les calculs internes sont normalement de 64 bits ou 80 bits (double long). Vous pouvez remplacer cela en utilisant du code d'assemblage en ligne, mais il n'y a aucune garantie que certaines fonctions de bibliothèque à double précision ne le feront pas reculer.
Microsoft a pris en charge les doubles longs de 80 bits avec leurs compilateurs 16 bits, mais a abandonné la prise en charge pour eux avec leurs compilateurs 32 bits et 64 bits, et les longs doubles sont maintenant les mêmes que les doubles à 64 bits.
Vous pouvez essayer d'utiliser une bibliothèque offrant une compatibilité des types de données multiplateforme.
"Les types intégraux C++ hérités de C sont un risque multiplateforme. Int, long et friends ont des tailles différentes sur différentes plates-formes (32 bits et 64 bits sur les systèmes actuels, peut-être 128 bits plus tard). Pour certaines applications peuvent sembler hors de propos car elles n'abordent jamais la limite 32 bits (ou plutôt 31 bits si vous utilisez des entiers non signés), mais si vous sérialisez vos objets sur un système 64 bits et désérialisez sur un système 32 bits vous pourriez être désagréablement surpris.
APR fournit un ensemble de typedefs pour les types de base qui peuvent être différents sur différentes plates-formes. Ces typedefs fournissent une taille garantie et évitent les types intégrés flous. Cependant, pour certaines applications (principalement numériques), il est parfois important d'utiliser la taille Word de la machine native (généralement ce que int signifie) pour obtenir des performances maximales. "
Gigi SAYFAN - Construire votre propre framework de plugin (De http://philippe.ameline.free.fr/techytechy/ 071125_PluginFramework.htm )
Je tiens à souligner que même si vous avez des flotteurs de même taille, vous ne pouvez pas assurez-vous que ces flotteurs sont également interprétés sur différentes plates-formes. Vous pouvez lire de nombreux articles sur les "flotteurs sur le réseau". Le non-déterminisme des flotteurs est un problème connu.