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 / 0
où x !== 0
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.
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.
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