Question

Pardonnez-moi si cela est un problème stupide débutants, mais je ne comprends vraiment pas.

J'ai une variable membre déclarée comme ceci:

public Double Value;

Quand je cède 3,14159265 à la valeur et essayer de calculer le sinus de celui-ci, cela se produit:

system.out.println(Value.toString()); //outputs 3.14159265
Value = Math.sin(Value);
system.out.println(Value.toString()); //outputs NaN

En fait, cela se produit à chaque valeur unique que j'ai essayé - même avec 0! Math.sin () semble toujours produire NaN en conséquence, quelle que soit la valeur des arguments.

Les docs disent:

  

Si l'argument est NaN ou une infinité, alors le résultat est NaN.

Mais mon argument est manifestement pas NaN ou l'infini!

Que diable se passe là-bas?

UPDATE

Je suis S'avère le plus stupide programmeur sur la terre. Dans mon projet, tout le code est bien sûr beaucoup plus complexe que l'exemple ci-dessus. Il est en quelque sorte un analyseur d'expression et évaluateur et pour les fonctions mathématiques définies j'utiliser un commutateur article pour décider fonction à appeler - J'ai oublié la déclaration de rupture dans les cas qui a causé la fonction sqrt à exécuter avec un paramètre négatif.

Comme je l'ai dit - le plus stupide programmeur sur la terre ...

J'ai accepté la plus haute réponse car il est le meilleur IMHO. Désolé les gars pour perdre votre temps -.-

Était-ce utile?

La solution

Double value = 3.14159265;
System.out.println(value.toString()); //outputs 3.14159265
value = Math.sin(value);
System.out.println(value.toString()); //outputs NaN

sorties (comme prévu):

3.14159265
3.5897930298416118E-9

problème devrait être un autre endroit, quelle version de JDK que vous utilisez? il est 32 bits ou 64 bits? est-il autre code au milieu que vous ne l'avez pas coller?

La seule façon d'obtenir une NaN de Math.sin est d'utiliser inf o NaN en tant que paramètre. Et sans affecter explicitement cette valeur à un numéro que vous pouvez obtenir en juste en faisant mauvais calculs, par exemple:

Double d = 0.0/0.0;
System.out.println(Math.sin(d));
double d2 = Double.POSITIVE_INFINITY;
System.out.println(Math.sin(d2));

cette sortie volonté. NaN deux fois

Deux notes:

  • ne pas utiliser des lettres majuscules pour les variables (utilisation value, non Value)
  • quand vous avez besoin piqûres en tant que paramètres (ou composés à d'autres chaînes) vous n'avez pas besoin d'appeler explicitement toString(), vous pouvez faire System.out.println(value)

Autres conseils

est ce que je reçois:

Double Value;
Value = 3.14159265 ;
System.out.println(Value.toString()); //outputs 3.14159265
Value = Math.sin(Value);
System.out.println(Value.toString()); //outputs 3.5897930298416118E-9

Alors il y a 2 options:

  1. Le code affiché est pas le code que vous utilisez (Je remarque que vous avez un minuscule S sur le système, donc ce ne sera pas compilé)
  2. Quelque chose d'autre est en train de changer la valeur de la valeur à NaN avant ou après que vous faites la Math.sin

Pour commencer, vous utilisez le type de référence Double (enveloppe), et non le double type primitif - pourquoi? Quel est le code que vous utilisez réellement pour initialiser Value (qui, d'ailleurs, ne devrait pas commencer par un caractère majuscule basé sur les normes de codage Java commun)? Je suppose que vous êtes tout simplement pas l'initialisation Value correctement. Essayez de commencer à l'aide d'un double (pas Double).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top