web-dev-qa-db-fra.com

Types à virgule flottante de taille fixe

Dans le stdint.h (C99), boost/cstdint.hpp et cstdint (C++ 0x) en-têtes, il y a, entre autres, le type int32_t.

Existe-t-il des types de virgule flottante de taille fixe similaires? Quelque chose comme float32_t?

79
Pietro

Rien de tel n'existe actuellement dans les normes C ou C++. En fait, rien ne garantit même que float sera un format binaire à virgule flottante.

Certains compilateurs garantissent que le type float sera au format binaire IEEE-754 32 bits. Certains non. En réalité, float est en fait le type IEEE-754 single sur la plupart plates-formes non intégrées, bien que les mises en garde habituelles concernant certains compilateurs évaluent les expressions dans un format plus large appliquer.

Un groupe de travail discute de l'ajout de liaisons de langage C pour la révision de 2008 de l'IEEE-754, qui pourrait envisager de recommander l'ajout d'un tel typedef. Si cela était ajouté au C, je m'attends à ce que la norme C++ fasse de même ... finalement.

42
Stephen Canon

Si vous voulez savoir si votre float est du type IEEE 32 bits, cochez std::numeric_limits<float>::is_iec559. C'est une constante de compilation, pas une fonction.

Si vous voulez être plus à l'épreuve des balles, vérifiez également std::numeric_limits<float>::digits pour vous assurer qu'ils n'utilisent pas sournoisement la double précision standard IEEE pour float. Il devrait être 24.

Quand cela vient à long double, il est plus important de vérifier digits car il existe quelques formats IEEE qui peuvent raisonnablement être: 128 bits (chiffres = 113) ou 80 bits (chiffres = 64).

Il ne serait pas pratique d'avoir float32_t en tant que tel car vous souhaitez généralement utiliser du matériel à virgule flottante, si disponible, et ne pas vous rabattre sur une implémentation logicielle.

28
Potatoswatter

Si vous pensez qu'avoir des typedefs tels que float32_t et float64_t n'est pas pratique pour quelque raison que ce soit, vous devez être trop habitué à votre système d'exploitation familier, compilateur, que vous ne pouvez pas trop regarder à l'extérieur de votre petit nid.

Il existe du matériel qui exécute nativement des opérations en virgule flottante IEEE 32 bits et d'autres qui le font en 64 bits. Parfois, ces systèmes doivent même se parler, auquel cas il est extrêmement important de savoir si un double est de 32 bits ou 64 bits sur chaque plate-forme. Si la plate-forme 32 bits devait effectuer des calculs excessifs sur la base des valeurs 64 bits de l'autre, nous pourrions vouloir effectuer une conversion avec une précision inférieure en fonction des exigences de synchronisation et de vitesse.

Personnellement, je me sens mal à l'aise en utilisant des flotteurs et des doubles, sauf si je sais exactement combien de bits ils sont sur ma platine. Encore plus si je dois les transférer sur une autre plate-forme via un canal de communication.

15
EmbeddedCoder

Il est actuellement proposé d'ajouter les types suivants dans la langue:

decimal32
decimal64
decimal128

qui pourra un jour être accessible via #include <decimal>.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html

3
Trevor Hickey