[英]Is y * (1 - x / y) better than y - x for computing the difference of two floating numbers in C++?
哈哈不。 災難性取消發生在您決定要找到兩個數字之間的差異的那一刻,如果這兩個數字幾乎相等且遠離0。無論您使用的公式多么古怪 - 這都是無關緊要的。精確差異計算已被丟棄。
為了避免這種情況,您需要計算和存儲不同的數字 。 也就是說,不是計算和存儲x
和y
,而是計算a=x
和b=yx
。 或者a=(x+y)/2
且b=(xy)/2
。 您不會從 x
和y
計算它們 - 這將具有完全相同的問題 - 而是,您將計算並將它們存儲為實際數字,並根據需要計算x
和y
。 (顯然,這需要選擇a
和b
,實際上可以根據您的用例進行計算。)
你所謂的“災難性取消”我稱之為Sterbenz定理:如果a / 2 <= b <= 2a,那么差異ba
就是可以表示的。
“災難性取消”這個詞有點用詞不當。 減法是完全無辜的; 當你把所需數字的一部分弄圓了就已經發生了災難。
我認為乘法和除法會給你帶來更多麻煩,但是,在長版本中,你仍然會減去兩個浮點數。
你從xy得到的誤差是你從1-(x / y)得到的誤差,你后來乘以y,得到相同的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.