5

给定 3 个 IEEE-754 浮点 a、b、c,它们不是 +/-INF 且不是 NaN 且 a < b,假设 a - c < b - c 是否安全?或者,你能举一个不正确的例子吗?

4

1 回答 1

11

假设a约为 0.00000000000000001,b约为 0.00000000000000002,c为 1。那么a - cb - c都将等于 -1。

(这是假设双精度值,也就是 64 位值。对于更高精度的值,您需要添加更多的零。)


编辑添加说明:

如果我们忽略非规范化值和非数字值和无穷大等,而只关注IEEE 754 双精度浮点值以便有一些具体的东西可以查看,那么 - 就二进制表示而言,浮点值由符号位s(0 表示正数,1 表示负数)、11 位指数e(偏移量为 1023,因此e =0 表示 2 −1023e =1023 表示 2 0,即 1) 和一个 52 位定点有效数m(表示二进制点之后的 52 位,因此它的范围从 [0,1) 到有限精度)。因此表示的实际值为 (-1)s  × (1 +  m ) × 2 e -1023

因为有效数字是定点的,并且具有固定的位数,所以精度非常有限。像 1.00000000000000001 这样的值和像 1.00000000000000002 这样的值在小数点后的很多位上都是相同的——比双精度有效数字可以容纳的位数更多。

当您在一个非常大的数字和一个非常小的数字之间执行加法或减法时(相对于彼此:在我们的示例中,1 是“非常大”;或者,我们可以使用 1 作为非常小的值并选择一个非常大的值值 10000000000000000),得到的指数将几乎完全由非常大的数字决定,并且非常小的数字的有效数字必须适当地缩放。在我们的例子中,它被除以大约 10 17;所以它就消失了。有效数字没有足够的位来区分它。

于 2012-11-16T15:43:25.323 回答