36 votes

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

J'ai essayé deux manières 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 le second moyen ne renvoie-t-il pas la réponse attendue qui est NaN (comme avec le premier moyen)?

49voto

Pieter Geerkens Points 5506

Un NaN est renvoyé (en vertu de la norme IEEE 754) afin de continuer d'un calcul quand une véritable indéfini (intermédiaire) résultat a été obtenu. L' infini est retourné afin de poursuivre un calcul après un débordement a eu lieu.

Ainsi, le comportement

Math.sqrt(Double.NEGATIVE_INFINITY); // NaN

est spécifiée, car elle est connue (facilement et rapidement) qu'une valeur non définie a été généré; en se basant 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épassement ET une opération non valide. Cependant, l'opération non valide la reconnaissance dépend de façon critique sur le degré de précision de la détermination de la deuxième argument est. Si le second argument est le résultat d'un avant arrondi de l'opération, alors il peut ne pas être exactement égale à 0,5. Ainsi, les moins graves, de la détermination, de la reconnaissance d'un dépassement de capacité, est retourné afin d'éviter la dépendance critique de la raison sur l'exactitude de la deuxième argument.

Plus de détails sur une partie du raisonnement derrière la norme IEEE 754 la norme, y compris le raisonnement derrière le retour des valeurs d'indicateur au lieu de générer des exceptions, est disponible dans

Ce Que Tout Informaticien Devez Savoir À Propos De L'Arithmétique À Virgule Flottante (1991, David Goldberg),

qui est à l'Annexe D de la

Sun Microsystems Pour Le Calcul Numérique Du Guide.

30voto

piet.t Points 4360

C'est seulement en agissant comme il est décrit dans la documentation de l' 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 négatif, zéro, et le deuxième argument est inférieur à zéro, mais pas finie entier impair, ou
  • le premier argument est l'infini négatif et le second argument est plus grand que zéro, mais pas finie entier impair,

le résultat est l'infini positif.

Pourquoi ils ont fait ce choix de conception: - vous aurez à demander aux auteurs de java.

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