在c++中计算两个浮点数之差时,y * (1 - x / y)是否优于y - x ?

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

本文关键字:是否 计算 c++ 两个 浮点数      更新时间:2023-10-16

在c++中减去两个浮点数可能导致灾难性的取消。

在数值稳定性方面,用y * (1 - x / y)代替y - x有什么优势吗?

哈哈,没有。当你决定要找出两个数字之间的差时,如果这两个数字几乎相等并且远离0,就会发生灾难性的消去。不管你用多么古怪的公式来计算,精确计算差值所需的信息都已经被丢弃了。

为了避免这种情况,需要计算和存储不同的数字。也就是说,不是计算和存储xy,而是计算a=xb=y-x。或者a=(x+y)/2b=(x-y)/2。您不会从 xy中计算它们——这将有完全相同的问题——相反,您将计算并存储它们作为实际数字,并根据需要计算xy。(显然,这需要ab的选择,实际上可以计算,给定您的用例。)

你所说的"灾难性消去"我称之为Sterbenz定理:如果a/2 <= b <= 2a,则差值b-a是完全可表示的。

"灾难性取消"这个词有点用词不当。减法是完全无害的;当你把你想要的数字四舍五入时,灾难已经发生了。

我认为乘法&除法会给你带来更多的麻烦,但是,在长版本中,你仍然减去两个浮点数。

从x-y得到的误差是y乘以从1-(x/y)得到的误差,然后再乘以y,得到相同的结果