簡體   English   中英

“雙精度浮點格式”的精度如何?

[英]How accurate is “double-precision floating-point format”?

假設使用Java輸入

雙數

如果我需要使用非常大或非常小的值,它們的精度如何? 我試圖閱讀雙打和浮球的工作原理,但我並沒有真正理解它。

對於我的編程入門學期項目,我可能需要使用具有較大價值范圍(多個數量級)的不同數字。

假設我創建了一個while循環,

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

ERROR的限制是否取決於number [i]的大小? 如果是這樣,我如何確定ERROR可以減小多少以退出循環?

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

ERROR的限制是否取決於number [i]的大小?

是。

如果是這樣,我如何確定ERROR可以減小多少以退出循環?

您可以使用Math.nextUp獲得“下一個最大”的雙Math.nextUp (或使用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]);

(但我認為“下一個最小”沒有等效的方法)

如果您不告訴我們您想使用它什么,那么我們只能回答標准知識:Java中的double大約有16位有效數字(即十進制數字系統的數字),並且最小可能的值為4.9 x 10 -324 這完全有可能比您需要的精度更高。

問題中的epsilon值(您稱為“錯誤”)根據您的計算而有所不同,因此沒有標准答案,但是如果您對簡單的東西使用double而不是對科學要求很高的東西,則使用類似1 x 10 -9 ,您會沒事的。

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,因為這種類型沒有限制(而是您的RAM是限制)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM