【发布时间】:2014-08-11 22:55:35
【问题描述】:
我在某处读到 C 双精度浮点中存在不确定性的来源,如下所示:
C 标准规定,仅需要 64 位浮点数(双精度)才能产生大约 64 位精度。
硬件可以在 80 位寄存器中进行浮点运算。
由于 (1),C 编译器不需要在将双精度值填充到高位之前清除浮点寄存器的低位。
这意味着 YMMV,即结果可能会发生微小差异。
是否存在真正发生这种情况的硬件和软件的任何现在常见的组合?我在其他线程中看到.net 有这个问题,但是 C 通过 gcc 加倍好吗? (例如,我正在测试基于精确相等的逐次逼近的收敛性)
【问题讨论】:
-
@Fabian 另一个问题是关于跨平台的可重复性,这是比同一平台上不同运行的可重复性更强的约束。
-
我相信答案是肯定的。这意味着即使
x == x也不能保证返回 true (这与无穷大或 NaN 无关,这是因为编译器可能会将相同的变量加载到 80 位寄存器中,然后将 64 位寄存器或内存加载到另一个时间)。 -
@EdHeal:程序不是计算机。
-
浮点算术通常不允许关联确定性。然而,在线程或 SIMD 并行编程中,通常使用失败者浮点模型来允许关联浮点运算。不能保证您在每个系统上都会得到相同的结果。
标签: c floating-point numeric non-deterministic