[英]Exactly where does floating point addition go wrong when adding 0.1 + 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
的精確總和,可以通過將f
和g
聲明為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.