簡體   English   中英

Java - 一次雙加/減的最大精度損失

[英]Java - maximum loss of precision in one double addition/subtraction

是否有可能建立甚至粗略地說,在java(加/減)中處理兩個double值時最大精度損失是多少? 可能最壞的情況是兩個數字無法准確表示,然后對它們執行操作,這導致一個值也無法准確表示。

最糟糕的情況是所有精度都可能丟失。 例如,如果結果大於最大可表示的有限數,則會發生這種情況。 然后它將存儲為POSITIVE_INFINITY(或NEGATIVE_INFINITY)。

關於您的更新,可以添加。

double a = Double.MAX_VALUE;
System.out.println(a);
double b = a + a;
System.out.println(b);

結果:

1.7976931348623157E308
Infinity

在線查看: ideone

通常,表示錯誤的大小與您的數字大小有關。

看看Math.ulp(double) double 精度的ulp是下一個最高值的增量。 例如,如果您添加到數字而一個小於另一個的ulp,則您知道添加將不起作用。 如果乘以兩個雙精度數,則可以將它們的ulps相乘以得到結果的最大誤差。

您可以查看輸入的實際精度,例如下面的代碼輸出:

input: 0.01000000000000000020816681711721685132943093776702880859375
range: [0.0099999999999999984734433411404097569175064563751220703125 - 0.010000000000000001942890293094023945741355419158935546875]
range size: 3.4694469519536141888238489627838134765625E-18
input: 10000000000000000
range: [9999999999999998 - 10000000000000002]
range size: 4
public static void main(String[] args) {
    printRange(0.01);
    printRange(10000000000000000d);
}

private static void printRange(double d) {
    long dBits = Double.doubleToLongBits(d);
    double dNext = Double.longBitsToDouble(dBits + 1);
    double dPrevious = Double.longBitsToDouble(dBits + -1);
    System.out.println("input: " + new BigDecimal(d));
    System.out.println("range: [" + new BigDecimal(dPrevious) + " - " + new BigDecimal(dNext) + "]");
    System.out.println("range size: " + new BigDecimal(dNext - dPrevious));
}

您仍然需要估算操作結果的損失。 這不適用於角落情況(Infinity,NaN等)。

暫無
暫無

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

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