Java Math.sin () produit NaN tout le temps
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 -.-
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
, nonValue
) - 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 faireSystem.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:
- 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é)
- 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
).