c - 四舍五入以避免在随后的求和中四舍五入

标签 c floating-point double ieee-754

我该如何实现?

// 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

最佳答案

让我们假设 xy 都是正数。

S 为 double 和 x + y

有两种情况:

  • 如果 xy,则 S - y 根据 Sterbenz 引理是准确的。由此可见,加法 (S - y) + y 是精确的(它恰好产生 S,这是一个 double )。因此,您可以为 x_new 选择 S - y。不仅 y + x_new 是准确的,而且它产生的结果 Sy + x 相同。

  • 如果 x > y,则根据 y 的有效位中设置的位数,您可能有问题。例如,如果 y 的有效数中的最后一位被设置,那么在 y 的二进制数之后的二进制数中没有数字 z 可以有z + y 是精确的属性。


此答案与 that answer 隐约相关.

关于c - 四舍五入以避免在随后的求和中四舍五入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21484602/

相关文章:

c - 将 8 字节值转换为实际数字 :

C# 字符串到 float 的转换

c - C 中使用 float 和 printf 时遇到问题

c - 打印不超过 n 的质数

循环不打印事件窗口

javascript - 有没有办法提高这个表达式的浮点精度?

c - 修改字符串数组

java - 如何显示 float 的附加数字?

c - sprintf 到 c 中的 char 指针列表?段错误

c - 复制到二进制文件时出现段错误