【发布时间】:2014-01-31 16:07:11
【问题描述】:
我该如何实现?
// 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附近返回一个x_new。然而,如果x大于y,那么任何在x附近的某个数字对y的加法都会强制将y的一些低位排除在总和之外。例如,假设x是 264,y是 1。满足要求的最接近的double(使用 IEEE-754 64 位二进制)是 253-1,并且根本不在 2**64 附近。 -
@eric ,这是正确的。假设 x 归一化指数(由 frexp 返回)小于或等于 y/ref 归一化指数
-
我改了标题,因为“双舍入”已经有了特定的含义,“双”用作形容词。
-
请注意,检查
(y + x_new) - x_new == y与检查x_new + y是否准确不同。后者暗示了前者,但不是必须的。示例:y=1e300, x_new=1。(y + x_new) - x_new == 1e300 == y但添加y + x_new不准确。
标签: c floating-point double ieee-754