2016-03-31 165 views

回答

6

@PeterLawrey規定在15

最大精度這實際上不是他的所有規定。他說是:

雙重具有精度

的15點數字,他是錯的。他們有十進制的數字的準確性。

的十進制數字在任何數目的數目由它的日誌提供給基座10圖15是日誌(2 -1)時,地板值,其中53是尾數的位的數目(包括隱含位),如Javadoc和IEEE 754中所描述的,因此-1是最大可能的尾數值。實際值是15.954589770191003298111788092734到Windows計算器的限制。

他把它描述爲'精確的小數位'是完全錯誤的。 A double具有15位十進制數字的精度爲,如果它們全部在小數點之前。對於具有小數部分的數字,由於小數和二進制小數的不可通約性,您可以在小數表示中得到多於15位的數字。

+0

謝謝澄清一下。然而,2^53最大尾數值意味着15位數字? –

+0

任何數字中的小數位數由其日誌給出,以10爲底。 – EJP

+2

「直線對數參數」僅適用於整數,這也許就是您在上一段中所說的內容。對於浮點,你必須像我這樣做一個派生:http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/。對於雙打你得到相同的答案(15);對於浮點數,log_10(2^24-1)約爲7.22,但最大精度爲6.(另請參見http://stackoverflow.com/questions/30688422/is-the-most-significant-decimal-digits-precision - 可以轉換爲二進制。) –

0

你也可以「測量」它直接:

for(double d = 1 ; d > 0 ; d/=2) System.out.println(d); 

這段代碼的想法是一個單個位達到最小值。所以你從1(它只有1位)開始,除以2(將二進制右移),直到你到達最後一位。由這個循環最後打印的數量是:

4.9E-324

+3

這是如何顯示雙打有15位數的精度? – assylias

+1

在double中表示的最小值與其最大精度沒有任何關係。一個是指數寬度的函數,另一個是尾數寬度的函數。 – EJP

0

運行該代碼,並看到它停止

public class FindPrecisionDouble { 
    static public void main(String[] args) { 
    double x = 1.0; 
    double y = 0.5; 
    double epsilon = 0; 
    int nb_iter = 0; 
    while ((nb_iter < 1000) && (x != y)) { 
     System.out.println(x-y); 
     epsilon = Math.abs(x-y); 
     y = (x + y) * 0.5; 
    } 
    final double prec_decimal = - Math.log(epsilon)/Math.log(10.0); 
    final double prec_binary = - Math.log(epsilon)/Math.log(2.0); 
    System.out.print("On this machine, for the 'double' type, "); 
    System.out.print("epsilon = "); 
    System.out.println(epsilon); 
    System.out.print("The decimal precision is "); 
    System.out.print(prec_decimal); 
    System.out.println(" digits"); 
    System.out.print("The binary precision is "); 
    System.out.print(prec_binary); 
    System.out.println(" bits"); 
    } 
} 

可變y變得比1.0不同的值最小。在我的電腦(Mac Intel Core i5)上,它停在1.1102...E-16。然後打印精度(十進制和二進制)。

https://en.wikipedia.org/wiki/Machine_epsilon所述,可以用epsilon值來估計浮點精度。 它是「最小的數字,當加入到一個時,產生不同於一個的結果」(我做了一個小的變化:1-e而不是1 + e,但邏輯相同)

I'以十進制解釋:如果精度爲4位小數,則可以表示1.0000-0.0001,但不能表示數字1.00000-0.00001(缺少第5位小數)。在這個例子中,精度爲4位小數,epsilon爲0.0001。 epsilon直接測量浮點精度。只需轉換爲二進制。

編輯您的問題問「如何確定...」。你所搜索的答案不僅僅是一種確定精確度的方式(與你接受的答案一樣)。無論如何,對於其他人來說,在機器上運行此代碼將決定「雙」類型的精度。

+0

這究竟是什麼意圖顯示? – EJP

+0

它試圖找到與浮點精度有關的ε值。請參閱https://en.wikipedia.org/wiki/Machine_epsilon(查看錶格中的binary64行) –

+0

他詢問浮點精度本身而不是epsilon,他具體詢問值15,你根本沒有解決。 – EJP

-1

最大精度爲double是第一個大於0的值。根據Double的Javadoc,這個數字代表Double.MIN_VALUE。你可以將它輸出如下:

BigDecimal doubleMinVal = BigDecimal.valueOf(Double.MIN_VALUE); 
System.out.println(doubleMinVal.toPlainString()); 
System.out.println(doubleMinVal.toString()); 

爲例見this IDEOne program

+1

我不認爲這是真的。我相信OP希望知道雙倍有意義的有效數字的確切數量。最小可能(絕對)雙倍值僅是具有最大負指數部分和最小數部分的那個值。 – Paul

+0

您正在將精度與範圍混淆,就像這裏的其他答案一樣。 – EJP