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 -.-

È stato utile?

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, non Value)
  • quando hai bisogno di punture come parametri (o composte per altre stringhe) non è necessario chiamare in modo esplicito toString(), si può fare System.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:

  1. 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)
  2. 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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top