224 votes

Est-ce que +0 et -0 sont les mêmes?

Lors de la lecture de la spécification ECMAScript 5.1 , on distingue +0 et -0 .

Pourquoi alors +0 === -0 s’évalue-t-il à true ?

237voto

Felix Kling Points 247451

JavaScript utilise la norme IEEE 754 standard pour représenter des nombres. De Wikipedia:

Signé zéro est zéro associé à un signe. Dans l'arithmétique ordinaire, -0 = +0 = 0. Toutefois, dans le calcul, un certain nombre de représentations de permettre l'existence de deux zéros, souvent désigné par -0 (négatif zéro) et +0 (zéro positif). Cela se produit dans certains signé nombre de représentations pour les entiers, et dans la plupart des nombre à virgule flottante représentation. Le nombre 0 est généralement codé comme +0, mais peut être représenté par +0 ou -0.

La norme IEEE 754 pour l'arithmétique à virgule flottante (actuellement utilisé par la plupart des ordinateurs et des langages de programmation qui prennent en charge les nombres à virgule flottante) nécessite à la fois de +0 et -0. Les zéros peut être considéré comme une variante de l'extension de la ligne de nombre réel tel que 1/-0 = −∞ et 1/+0 = +∞, la division par zéro n'est pas défini pour ±0/±0 et ±∞/±∞.

L'article contient de plus amples informations sur les différentes représentations.

C'est la raison pourquoi, techniquement, les deux zéros doivent être distingués.

Toutefois, +0 === -0 évalue à true. Pourquoi est-ce (...) ?

Ce comportement est explicitement définie dans la section 11.9.6, l' Égalité Stricte de l'Algorithme de Comparaison (l'accent partie de la mienne):

La comparaison x === yx et y sont des valeurs, produit de vrai ou de faux. Une telle comparaison est effectuée comme suit:

(...)

  • Si le Type(x) est le Nombre, puis

    1. Si x est NaN, retourne false.
    2. Si y est NaN, retourne false.
    3. Si x est le même Numéro de valeur y, retourner la valeur true.
    4. Si x est de +0 et y est de -0, retourner la valeur true.
    5. Si x est 0 et y +0, renvoyer true.
    6. Retourne la valeur false.

(...)

(La même chose vaut pour +0 == -0 btw.)

Il semble logiquement pour traiter l' +0 et -0 comme égaux. Sinon, nous aurions à prendre en compte dans notre code et personnellement, je ne veux pas le faire ;)

8voto

arnaud576875 Points 35281

Dans la norme IEEE 754 utilisée pour représenter le type Number en JavaScript, le signe est représenté par un bit (un 1 indique un nombre négatif).

En conséquence, il existe à la fois une valeur négative et une valeur positive pour chaque nombre représentable, y compris 0 .

C'est pourquoi il existe à la fois -0 et +0 .

2voto

GolezTrol Points 54531

Il y a deux valeurs possibles (représentations en bits) pour 0. Ce n'est pas unique. En particulier dans les nombres à virgule flottante cela peut se produire. C'est parce que les nombres à virgule flottante sont stockés comme une sorte de formule.

Les nombres entiers peuvent être stockés dans différents moyens. Vous pouvez avoir une valeur numérique avec un signe supplémentaire bits, donc en 16 bits espace, vous pouvez stocker 15 bits valeur entière et un signe-bits. Dans cette représentation, la valeur 1000 (hex) et de 0000 à la fois sont à 0, mais l'un d'eux est de +0 et l'autre est de 0.

Cela pourrait être évité en soustrayant 1 de la valeur de l'entier donc il varie de -1 à -2^16, mais ce qui serait gênant.

Une approche plus commune est de stocker des entiers dans les deux compléments", mais apparemment ECMAscript a choisi de ne pas. Dans cette méthode, les numéros de plage de 0000 à 7FFF positif. Les nombres négatifs commencent à FFFF (-1) à 8000.

Bien sûr, les mêmes règles s'appliquent à de plus grands nombres entiers trop, mais je ne veux pas que mon F à l'usure. ;)

1voto

Spudley Points 85371

Wikipedia a un bon article pour expliquer ce phénomène: http://en.wikipedia.org/wiki/Signed_zero

En bref, les valeurs +0 et -0 sont définies dans les spécifications en virgule flottante IEEE. Les deux sont techniquement distincts de 0 sans signe, ce qui est un entier, mais dans la pratique, ils s’évaluent tous à zéro; la distinction peut donc être ignorée à toutes fins utiles.

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