J'ai essayé deux façons différentes de trouver la racine carrée en Java:
Math.sqrt(Double.NEGATIVE_INFINITY); // NaN
Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity
Pourquoi la deuxième méthode ne renvoie-t-elle pas la réponse attendue qui est NaN
(la même que pour la première méthode)?
Un NaN est retourné (sous IEEE 754) afin de continuer un calcul quand un résultat vraiment non défini (intermédiaire) a été obtenu. Un infini est retourné afin de continuer un calcul après un débordement.
Ainsi, le comportement
Math.sqrt(Double.NEGATIVE_INFINITY); // NaN
est spécifié car il est connu (facilement et rapidement) qu'une valeur non définie a été générée; basé uniquement sur le signe de l'argument.
Cependant l'évaluation de l'expression
Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity
rencontre à la fois un débordement ET une opération non valide. Cependant, la reconnaissance d'opération invalide dépend de façon critique de la précision de la détermination du deuxième argument. Si le deuxième argument est le résultat d'une opération d'arrondi antérieure, il peut ne pas être exactement 0,5. Ainsi, la détermination la moins sérieuse, la reconnaissance d'un débordement, est renvoyée afin d'éviter une dépendance critique du résultat à la précision du deuxième argument.
Des détails supplémentaires sur certains des raisonnements derrière la norme IEEE 754, y compris le raisonnement derrière le retour des valeurs d'indicateur au lieu de générer des exceptions, sont disponibles dans
qui est l'annexe D de
Il agit comme décrit dans la documentation of Math
.
Pour Math.sqrt
:
Si l'argument est NaN ou inférieur à zéro, le résultat est NaN.
Pour Math.pow
:
Si
- le premier argument est un zéro négatif et le deuxième argument est inférieur à zéro mais pas un entier impair fini, ou
- le premier argument est l'infini négatif et le deuxième argument est supérieur à zéro mais pas un entier impair fini,
alors le résultat est l'infini positif.
Quant à savoir pourquoi ils ont fait ce choix de conception - vous devrez demander aux auteurs de Java.