令 double d=9.2,为什么 int a= d*10 是 92 而不是 91?

Let double d=9.2, why int a= d*10 is 92 not 91?

d=9.2 的二进制表示应该类似于 9.199999999999999289457264239899814128875732421875。

所以 10d 应该是 91.999999999xxxxxxx。

让int a = 10d,不是截断为91​​而不是92吗?

执行乘法时,real-number结果四舍五入以适应IEEE-754 binary64格式,四舍五入后的结果正好是92。

将9.2转换为binary64表示的最接近的值时,结果确实是9.199999999999999289457264239899814128875732421875。使用十六进制作为有效数,即 1.266666666666616•23.

当我们使用 real-number 算术将其乘以 10 时,结果是 B.7FFFFFFFFFFFC16•23。 (这个很容易看出来,从右边开始,6乘以10就是6010,也就是3C16。所以我们写C位并进位 3。在下一列中,6 乘以 10 又是 3C16,加上进位 3 得到 3F16。我们写下F 数字并进位 3。继续产生更多 F 数字并将进位 3 传播到前面,其中 2 乘以 10 加上进位 3 为 2310 = 1716,所以我们写7进1。最后1乘以10加1就是1110 = B16.)

让我们调整该数字以将其归一化,使其在小数点后留下一位。将有效数右移三位并通过将三加到指数进行补偿得到 1.6FFFFFFFFFFFF816•26。现在我们可以看到这个数字的位数太多,不适合 binary64 格式。开头的 1 有一位,接下来的 13 位有四位,最后的 8 有一位有效位(10002,尾随零只是占位符,不是有效位)。那是 54 位,但是 binary64 格式只有 53 个有效数字(52 个显式存储在有效数字字段中,一个通过指数字段编码)。所以我们必须将它四舍五入以适应格式。

两个最接近的可表示值是 1.6FFFFFFFFFFFF16•26 和 1.700000000000016 •26。它们与1.6FFFFFFFFFFFF816•26的距离相等,平局的规则是选择偶数低位的数字。所以结果是 1.700000000000016•26.

因此,将 9.199999999999999289457264239899814128875732421875 乘以 10 在 binary64 算术中得到 1.716•26,即 92。