我想確定雙精度的最大精度是多少。在這個鏈接中接受的答案的評論Retain precision with double in Java @PeterLawrey指出15中的最大精度。如何確定雙精度的最大精度
你如何確定這一點?
我想確定雙精度的最大精度是多少。在這個鏈接中接受的答案的評論Retain precision with double in Java @PeterLawrey指出15中的最大精度。如何確定雙精度的最大精度
你如何確定這一點?
@PeterLawrey規定在15
最大精度這實際上不是他的所有規定。他說是:
雙重具有精度
的15點數字,他是錯的。他們有十進制的數字的準確性。
的十進制數字在任何數目的數目由它的日誌提供給基座10圖15是日誌(2 -1)時,地板值,其中53是尾數的位的數目(包括隱含位),如Javadoc和IEEE 754中所描述的,因此-1是最大可能的尾數值。實際值是15.954589770191003298111788092734到Windows計算器的限制。
他把它描述爲'精確的小數位'是完全錯誤的。 A double
具有15位十進制數字的精度爲,如果它們全部在小數點之前。對於具有小數部分的數字,由於小數和二進制小數的不可通約性,您可以在小數表示中得到多於15位的數字。
謝謝澄清一下。然而,2^53最大尾數值意味着15位數字? –
任何數字中的小數位數由其日誌給出,以10爲底。 – EJP
「直線對數參數」僅適用於整數,這也許就是您在上一段中所說的內容。對於浮點,你必須像我這樣做一個派生: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 - 可以轉換爲二進制。) –
運行該代碼,並看到它停止
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直接測量浮點精度。只需轉換爲二進制。
編輯您的問題問「如何確定...」。你所搜索的答案不僅僅是一種確定精確度的方式(與你接受的答案一樣)。無論如何,對於其他人來說,在機器上運行此代碼將決定「雙」類型的精度。
最大精度爲double
是第一個大於0的值。根據Double的Javadoc,這個數字代表Double.MIN_VALUE
。你可以將它輸出如下:
BigDecimal doubleMinVal = BigDecimal.valueOf(Double.MIN_VALUE);
System.out.println(doubleMinVal.toPlainString());
System.out.println(doubleMinVal.toString());
你看過[重複問題中的鏈接維基](https://en.wikipedia.org/wiki/Double-precision_floating-point_format)嗎? Java使用IEEE 754浮點雙打。 –