Descente double pour flotter: le comportement de débordement est-il garanti?

Si j’essaye ça

float f = (float)numeric_limits::infinity(); 

Ou bien, essayez de jeter quelque chose de plus grand que float max en float, suis-je assuré de finir avec l’infini?

Cela fonctionne sur GCC, mais est-ce une norme?

float f = (float)numeric_limits::infinity();

Cela est garanti pour régler f à l’infini si votre plate-forme de compilation offre l’arithmétique IEEE 754 pour les calculs en virgule flottante (c’est généralement le cas).

Ou bien, essayez de jeter quelque chose de plus grand que float max en float, suis-je assuré de finir avec l’infini?

Dans le mode arrondi au plus proche IEEE 754 par défaut, quelques valeurs double supérieures au float fini maximal (c’est-à-dire, FLT_MAX ) sont converties en FLT_MAX . La limite exacte est le nombre situé à mi-chemin entre FLT_MAX ( 0x1.fffffep127 dans une représentation hexadécimale C99) et le prochain nombre float qui pourrait être représenté si l’exposant au format simple précision avait une plage plus étendue, 0x2.0p127 . La limite est donc 0x1.ffffffp127 ou environ 3,4028235677973366e + 38 en décimal.

A partir de la norme C ++ 11, § 4.8.1:

Une valeur de type virgule flottante peut être convertie en une valeur de type autre. Si la valeur source peut être représentée exactement dans le type de destination, le résultat de la conversion est cette représentation exacte. Si la valeur source est comprise entre deux valeurs de destination adjacentes, le résultat de la conversion est un choix défini par l’implémentation de l’une ou l’autre de ces valeurs. Sinon, le comportement n’est pas défini.

Cela implique que

  • Si vous lancez un double infini pour flotter, vous obtenez un infini flottant.

  • Si vous transposez une valeur double, comprise entre float max et infinity, float, alors vous obtenez float max ou float infinity.