在 C 中添加和减去值

SoN*_*oob 1 c floating-point

我在一次考试中得到了以下考题,如果有人能帮助解释以下问题,我将不胜感激。

考虑以下代码:

double a = 1.0, b = 1.0, c = 1.0e-16;
a += c;
a -= c;
b -= c;
b += c;
Run Code Online (Sandbox Code Playgroud)

a 和 b 的值是什么?

A: a 和 b 都等于 1:0。

B:a 等于 1:0,b 小于 1:0。

C:a小于1:0,b等于1:0。

D:a小于1:0且b小于1:0。

int*_*jay 5

首先,C 标准没有定义浮点数的确切行为和准确性。如果我们假设 IEEE-754 双精度浮点数,那么可以说如下:

DBL_EPSILON(约 2.2e-16)被定义为 1 和下一个更大的可表示数之间的差。这意味着如果您至少添加DBL_EPSILON / 2到 1.0,结果1.0 + DBL_EPSILON将比 1.0更接近,因此结果不会是 1.0。对于您的代码,c小于DBL_EPSILON / 2,因此1.0 + c给出1.0.

(注意:我在这里假设舍入模式是舍入到最接近的数字,这是大多数实现的默认值。其他舍入模式可能会给出不同的结果)。

当低于 2 的幂(例如 1.0)时,浮点数的密度会加倍。这意味着 epsilon 的有效值下降到其值的一半。因此DBL_EPSILON / 4,当从 1.0 中减去时,会给出不同结果的最小值。因为c > DBL_EPSILON / 41.0 - c给出了不同的结果。

这样做的结果是,第一次加法a没有效果,但减法会改变它,所以它最终b会得到一个小于 1 的值。将受到两个操作的影响,最终等于 1.0。

这是通过尝试验证的,给出:

a=0.99999999999999988898 b=1.00000000000000000000