Infinity en MSVC ++

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().