簡體   English   中英

java浮點精度(0.1 + 0.2 + ... + 1.00 ..或.. 1.00 + 0.99 + 0.98 + ... + 0.1)

[英]java floating point accuracy ( 0.1+0.2+…+1.00 ..or.. 1.00+0.99+0.98+…+0.1 )

我正在讀考試,我解決了這個問題

添加0.1 + 0.2 + ... + 1.00 ..或1.00 + 0.99 + 0.98 + ... + 0.1

在哪個位置添加數字以獲得更高的Java准確性?

任何COBOL程序員都可以立即回答這個問題。

問題的關鍵在於,如果首先添加大數字,則在添加小數字時會丟失精度。 首先添加小數字。

有一個結果表明,如果按遞增順序添加一系列正數,則可以獲得更好的最壞情況誤差限制。 該結果並不意味着,對於給定的正數序列,通過以遞增的順序添加數字,可以獲得更小的誤差。

例證:

int main() {
  float f = 0, g = 1;
  for (int i = 1; i <= 99; i++) {
    char buf[42];
    float ff;
    sprintf(buf, "0.%02i", i);
    sscanf(buf, "%f", &ff);
    f += ff;
    sprintf(buf, "0.%02i", 100-i);
    sscanf(buf, "%f", &ff);
    g += ff;
  }
  f += 1;
  printf("%a %a\n", f, g);
}

版畫

0x1.940002p+5 0x1.93fffep+5

所討論的100個float的精確總和,可以通過將fg聲明為double (但將ff保留為float )來計算,為0x1.93ffffff8p+5 ,表示按遞減順序對數字求和在此處獲勝。

由於這是一個算術系列,其總和可以如下計算

Sn = n * (a1 + an) / 2

Sn ... sum
n  ... number of elements
a1 ... first element
an ... last element

當你消除大部分數字時,這似乎是最好的解決方案。

比線性地對所有數字求和更好,你應該研究一種分而治之的方法(分別是數組的一半)。

這非常類似於浮點數的精確和

暫無
暫無

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

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