bec*_*cko 2 c++ floating-point
用C++减去两个浮点数会导致灾难性的取消.
在数值稳定性方面,写作是否有利于y * (1 - x / y)代替y - x?
Sne*_*tel 14
哈哈不.灾难性取消发生在您决定要找到两个数字之间的差异的那一刻,如果这两个数字几乎相等且远离0.无论您使用的公式多么古怪 - 这都是无关紧要的.精确差异计算已被丢弃.
为了避免这种情况,您需要计算和存储不同的数字.也就是说,不是计算和存储,x并且y,说,你会计算a=x和b=y-x.或者a=(x+y)/2和b=(x-y)/2.你不会计算它们的 x和y-这将有完全一样的问题-相反,你会计算并储存它们的实际数量,并计算x和y需要.(显然,这需要选择,a并且b考虑到您的用例,实际上可以计算出来.)
你所谓的"灾难性取消"我称之为Sterbenz定理:如果a/2 <= b <= 2a,那么差异b-a就是可以表示的.
"灾难性取消"这个词有点用词不当.减法是完全无辜的; 当你把所需数字的一部分弄圆了就已经发生了灾难.
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |