web-dev-qa-db-fra.com

Quelle est la taille de float et double en C et C ++?

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 .

23
mans

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.

14
Deduplicator

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.

12
Blaz Bratanic

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.

7
danielfranca

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.

4
Bathsheba

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.

0
rcgldr

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 )

0
HRold

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.

0
GreenScape