Si j'écris:
int x = /* any non-zero integer value */;
float y = x;
float z = y / y;
z
est-il garanti d'être exactement 1.f?
Si votre implémentation C++ utilise IEEE754, alors oui, cela est garanti. (L'opérateur de division doit renvoyer la meilleure valeur en virgule flottante possible).
Les niquement exceptions pour y / y
, en général, n'étant pas 1f
sont les cas où y
est NaN
, +Inf
, -Inf
, 0f
, et -0f
, ou si vous êtes sur une plate-forme où int
est si large que certaines de ses instances ne peuvent pas être représentées dans un float
sans que float
soit défini sur +Inf
ou -Inf
1. En mettant de côté ce dernier point, dans votre cas, cela signifie que int x = 0;
produira la seule exception.
IEEE754 est extrêmement courant. Mais pour vérifier avec certitude, testez la valeur de
std::numeric_limits<float>::is_iec559;
1Une plate-forme, par exemple, avec un 128 bits int
et un IEEE754 32 bits float
présenterait ce comportement pour certaines valeurs de x
.
Non, pas dans tous les cas, même pour IEEE754.
Par exemple, avec int x = 0;
, vous obtiendrez NaN. ( en direct )