web-dev-qa-db-fra.com

Un nombre entier flottant divisé par lui-même est-il garanti à 1.f?

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?

73
j b

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 -Inf1. 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.

94
Bathsheba

Non, pas dans tous les cas, même pour IEEE754.

Par exemple, avec int x = 0;, vous obtiendrez NaN. ( en direct )

33
Baum mit Augen