簡體   English   中英

是否y *(1 - x / y)優於y - x,用於計算C ++中兩個浮點數的差異?

[英]Is y * (1 - x / y) better than y - x for computing the difference of two floating numbers in C++?

用C ++減去兩個浮點數會導致災難性的取消

在數值穩定性方面,寫y * (1 - x / y)而不是y - x有什么好處嗎?

哈哈不。 災難性取消發生在您決定要找到兩個數字之間的差異的那一刻,如果這兩個數字幾乎相等且遠離0。無論您使用的公式多么古怪 - 這都是無關緊要的。精確差異計算已被丟棄。

為了避免這種情況,您需要計算和存儲不同的數字 也就是說,不是計算和存儲xy ,而是計算a=xb=yx 或者a=(x+y)/2b=(xy)/2 您不會 xy計算它們 - 這將具有完全相同的問題 - 而是,您將計算並將它們存儲為實際數字,並根據需要計算xy (顯然,這需要選擇ab ,實際上可以根據您的用例進行計算。)

你所謂的“災難性取消”我稱之為Sterbenz定理:如果a / 2 <= b <= 2a,那么差異ba就是可以表示的。

“災難性取消”這個詞有點用詞不當。 減法是完全無辜的; 當你把所需數字的一部分弄圓了就已經發生了災難。

我認為乘法和除法會給你帶來更多麻煩,但是,在長版本中,你仍然會減去兩個浮點數。

你從xy得到的誤差是你從1-(x / y)得到的誤差,你后來乘以y,得到相同的結果。

暫無
暫無

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

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