我该如何实现?
// round to the nearest double so that x + ref doesn't cause round off error
double round(double x, double ref) { }
这样
double x = ....;
double y = ....;
double x_new = round(x, y);
return x_new + y; // NO ROUND OFF!
换句话说 (y + x_new) - x_new 严格等于 y
最佳答案
让我们假设 x
和 y
都是正数。
令 S
为 double 和 x + y
。
有两种情况:
如果
x
≤y
,则S - y
根据 Sterbenz 引理是准确的。由此可见,加法(S - y) + y
是精确的(它恰好产生S
,这是一个 double )。因此,您可以为x_new
选择S - y
。不仅y + x_new
是准确的,而且它产生的结果S
与y + x
相同。如果
x
>y
,则根据y
的有效位中设置的位数,您可能有问题。例如,如果y
的有效数中的最后一位被设置,那么在y
的二进制数之后的二进制数中没有数字z
可以有z + y
是精确的属性。
此答案与 that answer 隐约相关.
关于c - 四舍五入以避免在随后的求和中四舍五入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21484602/