48 votes

Est-ce que float a un zéro négatif? (-0f)

Les nombres à virgule flottante IEEE ont un bit assigné pour indiquer le signe, ce qui signifie que vous pouvez techniquement avoir des représentations binaires différentes de zéro (+0 et -0). Y a-t-il une opération arithmétique que je pourrais faire, par exemple en C, qui donnerait une valeur de zéro flottante négative?

Cette question est inspirée d'une autre qui remettait en question la possibilité de comparer en toute sécurité 0.0f en utilisant ==, et je me demandais en outre s'il existe d'autres façons de représenter zéro qui pourraient provoquer la rupture de float1 == 0.0f pour des valeurs apparemment parfaitement égales.

[Edit] S'il vous plaît, ne commentez pas sur la sécurité de la comparaison des flottants pour l'égalité! Je n'essaie pas d'ajouter à ce seau débordant de questions en double.

1voto

Jeremiah Willcock Points 14674

Oui, les floats ont le zéro négatif tout comme d'autres types de nombres à virgule flottante IEEE tels que les double (sur les systèmes avec des nombres à virgule flottante IEEE). Il y a un exemple ici dans Octave de comment les créer ; les mêmes opérations fonctionnent en C. L'opérateur == traite +0 et -0 de la même manière, et donc les zéros négatifs ne cassent pas ce type de comparaison.

0voto

zviadm Points 809

Cette float1 == 0.0f comparaison n'est jamais vraiment sûre.

si vous avez quelque chose comme

float x = 0.0f;
for (int i = 0; i < 10; i++) x += 0.1f;
x -= 1.0f;
assert (x == 0.0f);

cela échouera même s'il est apparemment censé être 0.

0voto

dwelch Points 27195

Oui, vous pouvez avoir un +0 et un -0 et ce sont des motifs binaires différents (devraient échouer au test d'égalité). Vous ne devriez jamais utiliser == avec float, certainement pas avec une flotante IEEE. < ou > sont bons. Il y a beaucoup d'autres questions SO et discussions sur ce sujet, donc je n'entrerai pas dans les détails ici.

0voto

gcek2 Points 11

Vous devez faire preuve de prudence lors de la comparaison d'égalité en utilisant des nombres flottants. N'oubliez pas, vous essayez de représenter une valeur décimale dans un système binaire.

Est-il sûr de vérifier des valeurs flottantes pour l'égalité à 0 ?

Si vous devez comparer des valeurs flottantes, je vous suggère d'utiliser une sorte de tolérance qui vous convient float1 <= toleranceVal && float1 >= toleranceVal2 ou multiplier par un facteur de dix et le convertir en entier. if (!(int)(float1 * 10000)) { .. some stuff .. }

0voto

pixelbeat Points 12073

-lm a la fonction signbit() disponible pour indiquer si une valeur est négative (y compris -0)

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