Java Math.sin () produce NaN tutto il tempo
Domanda
Perdonami se questo è un problema principianti muto, ma io davvero non capisco.
Ho una variabile membro dichiarata in questo modo:
public Double Value;
Quando assegno 3.14159265 al valore e cercare di calcolare il seno di esso, questo accade:
system.out.println(Value.toString()); //outputs 3.14159265
Value = Math.sin(Value);
system.out.println(Value.toString()); //outputs NaN
In realtà, questo accade con ogni singolo valore ho provato - anche con 0! Math.sin () sembra produrre sempre NaN come risultato, indipendentemente dal valore argomenti.
La documentazione dicono:
Se l'argomento è NaN o un infinito, allora il risultato è NaN.
Ma la mia tesi non è chiaramente NaN o infinito!
Che diamine sta succedendo lì?
UPDATE
Risulta Sono il programmatore più stupida sulla terra. Nel mio progetto l'intero codice è, naturalmente, molto più complessa di quanto l'esempio di cui sopra. È una specie di un parser espressione e valutatore e per le funzioni matematiche definite Io uso un interruttore-clausola di decidere quale funzione chiamare - Ho dimenticato l'istruzione break nei casi che ha causato la funzione sqrt da eseguire con un parametro negativo.
Come ho già detto - più stupida programmatore sulla terra ...
ho accettato la risposta più alta in quanto è il migliore imho. Scusate ragazzi per sprecare il vostro tempo -.-
Soluzione
Double value = 3.14159265;
System.out.println(value.toString()); //outputs 3.14159265
value = Math.sin(value);
System.out.println(value.toString()); //outputs NaN
uscite (come previsto):
3.14159265
3.5897930298416118E-9
in modo problema dovrebbe essere da qualche altra parte, la versione di JDK stai usando? è a 32 bit o 64 bit? c'è altro codice in mezzo che non ti si incolla?
L'unico modo per ottenere un NaN
da Math.sin
è utilizzando inf
o NaN
come parametro. E senza assegnare esplicitamente che il valore a un numero è possibile ottenere in solo facendo calcoli errati, ad esempio:
Double d = 0.0/0.0;
System.out.println(Math.sin(d));
double d2 = Double.POSITIVE_INFINITY;
System.out.println(Math.sin(d2));
questa uscita volontà:. NaN
due volte
Due note:
- Non utilizzare lettere maiuscole per le variabili (uso
value
, nonValue
) - quando hai bisogno di punture come parametri (o composte per altre stringhe) non è necessario chiamare in modo esplicito
toString()
, si può fareSystem.out.println(value)
Altri suggerimenti
Questo è ciò che ottengo:
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
Quindi ci sono 2 opzioni:
- Il codice che hai postato non è il codice che si sta utilizzando (Ho notato che avete un caso inferiore S sul sistema, quindi questo non verrà compilato)
- Un'altra cosa sta cambiando il valore del valore per NaN prima o dopo si fa il Math.sin
Per cominciare, si sta utilizzando il tipo di riferimento Double
(involucro), non il tipo primitivo double
- perché? Qual è il codice che si sta usando per inizializzare Value
(che, BTW, non dovrebbe iniziare con un carattere maiuscolo sulla base di comuni standard di codifica Java)? La mia ipotesi è che si sta semplicemente non l'inizializzazione Value
correttamente. Prova a iniziare con l'utilizzo di un double
(non un Double
).