2017-05-07 108 views
0

比方說,使用java,我輸入「雙精度浮點格式」有多精確?

double number;

如果我需要使用非常大或非常小的值,它們可能有多精確? 我試圖讀取雙打和浮動工作,但我真的不明白。

對於我在編程介紹中的術語項目,我可能需要使用具有大範圍值(許多數量級)的不同數字。

比方說,我創建了一個while循環,

while (number[i-1] - number[i] > ERROR) { 
    //does stuff 
} 

進行錯誤校正的限制取決於數[I]的大小?如果是這樣,我怎樣才能確定ERROR有多小可以退出循環?

我知道我的老師在某個時候解釋了它,但我似乎無法在筆記中找到它。

+0

我認爲,如果你想得到確切的結果並避免雙舍入問題的情況下使用BigDecimal而不是double更好 –

+0

[Java中的大數]可能的重複(http://stackoverflow.com/questions/849813/large -ja數字-java) –

+0

*「我試圖讀懂雙打和漂浮是如何工作的,但我並沒有真正理解它。」*那麼你沒有得到什麼?如果你不明白,我們應該如何解釋答案? – Radiodef

回答

2

ERROR的限制取決於數字[i]的大小嗎?

是的。

如果是這樣,我怎樣才能確定ERROR可以有多小,以便退出循環?

你可以使用Math.nextUp「下一個最大的」雙(或「下一個最小的」使用Math.nextDown),例如

double nextLargest = Math.nextUp(number[i-1]); 
double difference = nextLargest - number[i-1]; 

由於Radiodef指出,你也可以直接使用Math.ulp的區別:

double difference = Math.ulp(number[i-1]); 

(但我不認爲有等效的方法爲「下一個最小」)

+2

您也可以使用'Math.ulp(double)'返回一個數字與下一個最大幅度之間的正距離,即基本上你在用減法做什麼。 – Radiodef

+0

@Radiodef非常好的一點。 –

+1

隨意添加到您的答案,如果你想。 – Radiodef

1

如果您不告訴我們您要使用它,那麼我們無法回答什麼比標準知識更多:java中的double約有16位有效數字(這是十進制編號系統的數字, )並且可能的最小值是4.9×1-324。這很可能遠高於你所需要的精確度。

你問題中的epsilon值(你稱之爲「ERROR」)取決於你的計算結果,因此沒有標準答案,但如果你使用雙打而不是高要求科學的東西,只需使用像1 x 10 -9,你會沒事的。

+1

我想用它來尋找螺線管的磁場,但是,我認爲它應該足夠大lol –

+0

磁場的計算確實涉及極小的數量,所以要注意的事實是,你只有16位有效數字,這意味着你所有的計算必須在相同的16個數量級內。不建議同時使用大量的數字和小數字。 (即不要嘗試混合納米與megaparsecs。) –

0

floatdouble原始類型受限於它們可以存儲的數據量。但是,如果您想知道這兩種類型的最大值,請使用您最喜歡的IDE運行以下代碼。

System.out.println(Float.MAX_VALUE); 
System.out.println(Double.MAX_VALUE); 
  • double數據類型是雙精度64位IEEE 754浮點(精度位數可以是15至17個十進制數字之間)。
  • float數據類型是單精度32位IEEE 754浮點數(精度數字可能在6到9位之間)。

運行上面的代碼,如果你不滿意自己的範圍比我會建議使用BigDecimal,因爲這類型沒有限制之後(而你的內存爲限)。

+0

謝謝 我的老師說,當我剛開始學習時,不要使用IDE,所以現在做記事本++上的所有內容 –