Question

J'utilisais simplement gdb pour imprimer une valeur d'un double et à ma grande surprise, il l'a imprimé -0

Qu'est-ce qu'un double de -0 valeur moyenne en C?

En passant, quand j'ai vérifié son égalité avec 0, il est retourné vrai: Pour faire la comparaison, j'ai juste fait ce qui suit

dans gdb

> print some_double
-0
> print some_double == 0
1
Était-ce utile?

La solution

Le zéro négatif est un concept utile pour le calcul numérique et constitue un nombre à virgule flottante valide C.

Autres conseils

Il s'agit d'un problème bien connu avec printf. Puisque vous utilisez un nombre à virgule flottante, il n’existe pas de représentation unique en binaire. Et la plupart du temps, la représentation binaire n'est pas parfaite. Ainsi, 0 est stocké sous 0.00000000000000...0042 parfois et sous -0.000000000000000000000123. Lorsque printf imprime le second, vous obtenez l’impair -0.

Je ne sais pas vraiment comment vous comparez avec 0, mais n'oubliez pas d'ajouter un epsilon lorsque vous effectuez des comparaisons à virgule flottante pour ajuster les bizarreries. E.g: pour vérifier si deux flottants sont égaux, n'écrivez jamais a == b mais fabs(a-b) < 1e-13 où 1e-13 est l'epsilon (choisissez un exposant qui vous convient).

En train de lire le livre & "Écrire un bon code, volume 1 &"; au chapitre 4, l'auteur donne la réponse très clairement, c'est à cause de l'utilisation du complément à 1 pour représenter le flottant signé dans IEEE FP Standard. Il dit:

  

La mantisse utilise un complément au format & # 8217; plutôt qu’à deux & # 8217; s. Cela signifie que la valeur de 24 bits de la mantisse est simplement un nombre binaire non signé et que le bit de signe, en position de bit 31, détermine si cette valeur est positive ou négative. Les numéros de complément d’un & # 8217; s ont la propriété inhabituelle qu’il existe deux représentations pour zéro (avec le bit de signe défini ou désactivé) . Généralement, cela n’est important que pour la personne qui conçoit le logiciel ou le système matériel à virgule flottante.

Mine de moi

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top