浮点处理器非确定性?

时间:2012-07-15 06:48:21

标签: c++ python floating-point

在没有进入不必要的细节的情况下,浮点数(x86_64)上的操作是否可以返回 - 基于相同的输入,它们的结果的变化很小?甚至一点点不同?

我正在模拟一个基本上混乱的系统,我希望数据上的小变化具有可见效果。但是我希望,使用相同的数据,程序的行为将得到修复。不是这种情况。我对程序的每次运行都有可见但可接受的差异。

我想我已经在某个地方留下了一些未初始化的变量......

我使用的语言是C ++和Python。

ANSWER

拉塞尔的回答是正确的。浮点运算是确定性的。非决定论是由悬空指针引起的。

2 个答案:

答案 0 :(得分:5)

是的,这是可能的。引自the C++ FAQ

  

事实证明,在某些安装中,cos(x)!= cos(y),即使x == y。那不是拼写错误;如果你没有感到震惊,那就再读一遍:某些东西的余弦可能与同一个东西的余弦不相等。 (或正弦,或切线,或日志,或几乎任何其他浮点计算。)

为什么?

  

[F]浮点计算和比较通常由通常包含特殊寄存器的特殊硬件执行,并且这些寄存器通常具有比双精度更多的位。这意味着中间浮点计算通常具有比sizeof(double)更多的位,并且当浮点值写入RAM时,它经常被截断,通常会丢失一些精度。

答案 1 :(得分:4)

Contra Thomas的回答,浮点运算不是非确定性的。它们非常微妙,但是如果没有使用未初始化的内存或故意随机化的数据,给定的程序应该为相同的输入提供相同的输出。

我的第一个问题是,“相同的数据”是什么意思?这些数据如何进入你的程序?