是否y*(1 - x/y)优于y - x,用于计算C++中两个浮点数的差异?

bec*_*cko 2 c++ floating-point

用C++减去两个浮点数会导致灾难性的取消.

在数值稳定性方面,写作是否有利于y * (1 - x / y)代替y - x

Sne*_*tel 14

哈哈不.灾难性取消发生在您决定要找到两个数字之间的差异的那一刻,如果这两个数字几乎相等且远离0.无论您使用的公式多么古怪 - 这都是无关紧要的.精确差异计算已被丢弃.

为了避免这种情况,您需要计算和存储不同的数字.也就是说,不是计算和存储,x并且y,说,你会计算a=xb=y-x.或者a=(x+y)/2b=(x-y)/2.你不会计算它们 xy-这将有完全一样的问题-相反,你会计算并储存它们的实际数量,并计算xy需要.(显然,这需要选择,a并且b考虑到您的用例,实际上可以计算出来.)

  • 是! 事实上,如果发生灾难性的取消,减法本身就保证是*精确*; 你无法从'x`和`y`获得更准确的结果.唯一的选择是找到一种直接计算差异的替代方法. (5认同)

tmy*_*ebu 6

你所谓的"灾难性取消"我称之为Sterbenz定理:如果a/2 <= b <= 2a,那么差异b-a就是可以表示的.

"灾难性取消"这个词有点用词不当.减法是完全无辜的; 当你把所需数字的一部分弄圆了就已经发生了灾难.