web-dev-qa-db-fra.com

Pourquoi la racine carrée de -Infinity + Infinity en Java?

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)?

35
Pratik

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

Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante (1991, David Goldberg) ,

qui est l'annexe D de

Guide de calcul numérique de Sun Microsystems .

48
Pieter Geerkens

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.

30
piet.t