2010-03-18 31 views
0

原諒我,如果這是一個愚蠢的初學者問題,但我真的不明白。Javas Math.sin()始終產生NaN

我有一個成員變量聲明,如下所示:

public Double Value; 

當我分配3.14159265到價值,並試圖計算它的正弦,出現這種情況:

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

其實,出現這種情況我嘗試了每一個值 - 即使是0! Math.sin()似乎總是生成NaN,無論參數值如何。

文檔說:

如果參數是NaN或無窮大,那麼結果是NaN。

但我的論點顯然不是NaN或無窮!

那裏發生了什麼?

UPDATE

原來我是地球上最愚蠢的程序員。在我的項目中,整個代碼當然比上面的例子複雜得多。它是一種表達式解析器&評估器,對於定義的數學函數,我使用switch-clause來決定調用哪個函數 - 我忘記了導致sqrt函數以負參數執行的情況下的break語句。

正如我所說的 - 地球上最愚蠢的程序員......

我接受了最上面的答案,因爲它是最好恕我直言。對不起,你們浪費你的時間 - -

+0

你試過硬編碼的雙打0.0,1.0嗎? – extraneon

+1

可能是自動裝箱的東西...你可以用'double'而不是'double'來試試嗎? –

+0

你的代碼甚至沒有編譯..你如何分配值? – Bozho

回答

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

輸出(如預期):

3.14159265 
3.5897930298416118E-9 

所以問題應該在其他地方,您使用的JDK版本?它是32位還是64位?中間還有其他代碼,你沒有粘貼?

Math.sin獲得NaN的唯一方法是使用infNaN作爲參數。而如果沒有明確指定該值一個數字,你可以只是做錯了計算,如獲得:

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

這將輸出:NaN兩次。

有兩點需要注意:

  • 不使用大寫字母變量(使用value,不Value
  • 當你需要蜇作爲參數(或由與其他字符串),你不需要顯式調用toString(),你可以做System.out.println(value)
3

對於初學者,你使用Double引用(包裝)類型,而不是double原始類型 - 爲什麼?什麼是你實際用來初始化Value(它,BTW,不應該以基於普通Java編碼標準的大寫字母開頭)的代碼?我的猜測是,你只是沒有正確初始化Value。嘗試從使用double(而不是Double)開始。

5

這就是我得到:

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 

因此,有2種選擇:

  1. 您發佈的代碼是不是你正在使用的代碼(我注意到你對系統較低的情況下S,所以這不會編譯)
  2. 還有其他的東西在你做Math.sin之前或之後將Value的值改爲NaN