web-dev-qa-db-fra.com

En JavaScript, pourquoi zéro divisé par zéro renvoie NaN, mais tout autre divisé par zéro renvoie Infinity?

Il me semble que le code

console.log(1 / 0)

devrait retourner NaN, mais à la place, il renvoie Infinity. Cependant ce code:

console.log(0 / 0)

fait retourne NaN. Quelqu'un peut-il m'aider à comprendre le raisonnement de cette fonctionnalité? Non seulement cela semble incohérent, mais il semble aussi être faux, dans le cas de x / 0x !== 0

45
Bloodyaugust

Parce que c'est ainsi que la virgule flottante est définie (plus généralement que simplement Javascript). Voir par exemple:

En gros, on pourrait penser à 1/0 comme la limite de 1/x car x tend vers zéro. Et 0/0 n'a aucune interprétation raisonnable, d'où NaN.

34
Oliver Charlesworth

En plus des réponses basées sur le concept mathématique de zéro, il y a une considération particulière pour les nombres à virgule flottante. Chaque résultat de sous-dépassement, chaque nombre non nul dont la magnitude absolue est trop petite pour être représentée comme un nombre non nul, est représenté comme zéro.

0/0 peut vraiment être 1e-500/1e-600, ou 1e-600/1e-500, ou bien d'autres ratios de très petites valeurs.

Le rapport réel pourrait être n'importe quoi, il n'y a donc pas de réponse numérique significative, et le résultat devrait être un NaN.

Considérez maintenant 1/0. Peu importe que le 0 représente 1e-500 ou 1e-600. Quoi qu'il en soit, la division déborderait et le résultat correct est la valeur utilisée pour représenter les débordements, Infinity.

9
Patricia Shanahan

Je me rends compte que c'est vieux, mais je pense qu'il est important de noter que dans JS il y a aussi un -0 qui est différent de 0 ou +0 ce qui rend cette fonctionnalité de JS beaucoup plus logique qu'à première vue.

1 / 0 -> Infinity
1 / -0 -> -Infinity 

ce qui est logiquement logique puisque dans le calcul, la raison pour laquelle la division par 0 n'est pas définie est uniquement parce que la limite gauche va à l'infini négatif et la limite droite à l'infini positif. Depuis le -0 et 0 sont des objets différents dans JS, il est logique d'appliquer le 0 positif à évaluer au positif Infinity et le négatif 0 à évaluer au négatif Infinity

Cette logique ne s'applique pas à 0/0, qui est indéterminé. Contrairement à 1/0, nous pouvons obtenir deux résultats en prenant des limites par cette méthode avec 0/0

lim h->0(0/h) = 0
lim h->0(h/0) = Infinity

ce qui bien sûr est incohérent, il en résulte donc NaN

4