J’utilise MSVC ++ et je veux utiliser la valeur spéciale INFINITY dans mon code.
Quel est le modèle d’octet ou la constante à utiliser dans MSVC ++ pour l’infini?
Pourquoi 1.0f / 0.0f semble-t-il avoir la valeur 0?
#include #include int main() { float zero = 0.0f ; float inf = 1.0f/zero ; printf( "%f\n", inf ) ; // 1.#INF00 printf( "%x\n", inf ) ; // why is this 0? printf( "%f\n", zero ) ; // 0.000000 printf( "%x\n", zero ) ; // 0 }
Utilisez numeric_limits
:
#include float maxFloat = std::numeric_limits::infinity();
printf("%x\n", inf)
attend un entier (32 bits sur MSVC), mais reçoit un double. L’hilarité s’ensuivra. Euh, je veux dire: comportement indéfini.
(Et oui, il reçoit un double puisque pour une liste d’arguments variables, les flottants sont promus au double).
De toute façon, vous devriez utiliser numeric_limits
, comme le dit l’autre réponse.
Dans la liste des arguments variables de printf, les flottants sont promus en doublons. La représentation en octets little-endian de l’infini en tant que double est 00 00 00 00 00 00 F0 7F.
Comme l’a mentionné peterchen, “% x” attend un int, pas un double. Donc, printf ne regarde que le premier octet sizeof (int) de l’argument. Aucune version de MSVC ++ ne définit un int supérieur à 4 octets. Vous obtenez donc tous les zéros.
Jetez un coup d’oeil à numeric_limits::infinity
.
C’est ce qui arrive quand vous mentez à printf (), il se trompe. Lorsque vous utilisez le spécificateur de format% x, il s’attend à ce qu’un entier soit transmis à la stack et non à un float transmis à la stack FPU. Réparer:
printf( "%x\n", *(__int32*)&inf ) ;
Vous pouvez obtenir l’infini du fichier d’en-tête C ++
:
float inf = std::numeric_limits::infinity().