79 votes

Est-il garanti qu'un nombre entier flottant divisé par lui-même soit égal à 1.f ?

Si j'écris :

int x = /* any non-zero integer value */;
float y = x;
float z = y / y;

Est z garantie d'être exactement 1.f ?

8 votes

Il faudrait faire preuve d'une pédanterie inhabituelle, même selon les normes du C++, pour soutenir que std::numeric_limits<int>::max() pourrait être plus grande que std::numeric_limits<float>::max() .

2 votes

@MSalters Haha, j'ai pensé à inclure cela, mais j'ai décidé que c'était trop stupide. :)

1 votes

@MSalters : FWIW, pour la plupart x , static_cast<int>(y) != x (si les deux sont en 32 bits), mais z sera toujours égal à 1.0f sauf si x == 0 car le nominateur et le dénominateur ont tous deux la même erreur d'arrondi.

96voto

Bathsheba Points 23209

Si votre implémentation C++ utilise IEEE754, alors oui, c'est garanti. (L'opérateur de division est nécessaire pour renvoyer la meilleure valeur possible en virgule flottante).

El uniquement exceptions pour y / y en général, ne pas être 1.f sont les cas où y est NaN , +Inf , -Inf , 0.f y -0.f ou si vous êtes sur une plateforme où int est si large que certaines de ses instances ne peuvent pas être représentées dans une float sans cela float étant réglé sur +Inf o -Inf 1 . En mettant de côté ce dernier point, dans votre cas, cela signifie que int x = 0; produira la seule exception.

Le IEEE754 est extrêmement courant. Mais pour en être sûr, testez la valeur de

std::numeric_limits<float>::is_iec559;

1 Une plate-forme, par exemple, avec un système d'exploitation de 128 bits. int et un IEEE754 32 bits float présenterait ce comportement pour certaines valeurs de x .

2 votes

Je ne pense pas que y peut devenir NaN.

0 votes

@BaummitAugen : Vous avez raison. J'ai donné un coup de jeune à ma phrase.

2 votes

Si vous voulez suivre cette voie, vous devrez également ajouter Inf, -Inf et -0f. :)

33voto

Baum mit Augen Points 3571

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

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

0 votes

Je l'ai juste glissé dans ma réponse avant que tu ne publies ça. J'ai un vote positif.

0 votes

J'ai trouvé votre formulation ambiguë et trompeuse, j'ai donc suggéré une modification pour la rendre plus claire.

3 votes

@cat Je peux comprendre la partie "pas dans tous les cas" de votre suggestion, mais votre utilisation de "Par exemple" suggère qu'il y a d'autres valeurs pour lesquelles la même chose s'applique, et pour cette raison, personnellement, je pense que la réponse qui est ici maintenant est meilleure que la réponse que vous avez suggérée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X