6

在数学上,可以证明 0.9 循环等于 1。然而,这个问题与无穷大、收敛或这背后的数学无关。

上面的假设可以用 C# 中的双精度表示,如下所示。

var oneOverNine = 1d / 9d;
var resultTimesNine = oneOverNine * 9d;

使用上面的代码,(resultTimesNine == 1d)计算结果为真。

当使用小数代替时,评估产生错误,但是,我的问题不是关于双精度和小数的不同精度。

既然没有类型具有无限精度,那么 double 如何以及为什么能在十进制没有的情况下保持这种相等性?oneOverNine关于变量存储在内存中的方式,上面代码的“字面意思”发生了什么?

4

2 回答 2

11

它取决于用于获得最接近 1/9 的可表示值的舍入。它可以去任何一种方式。您可以在 Rob Kennedy 的有用页面上调查可表示性问题:http: //pages.cs.wisc.edu/~rkennedy/exact-float

但是不要认为以某种方式 double 能够达到精确性。它不是。如果您尝试使用 2/9、3/9 等,您会发现舍入相反的情况。底线是 1/9 不能完全用二进制浮点表示。因此会发生舍入,并且您的计算会出现舍入错误。

于 2013-10-17T20:12:19.637 回答
2

关于 oneOverNine 变量存储在内存中的方式,上面代码的“字面意思”发生了什么?

你问的是什么叫做IEEE 754。这是 C#、底层 .Net 运行时以及大多数其他编程平台用于存储和操作十进制值的规范。这是因为对 IEEE 754 的支持通常直接在 CPU/芯片组级别实现,这使得它比仅在软件中实现的替代方案具有更高的性能,并且在构建编译器时更容易,因为这些操作几乎直接映射到特定的 CPU 指令.

于 2013-10-17T20:25:34.807 回答