5

在不涉及不必要的细节的情况下,浮点数 (x86_64) 上的操作是否有可能基于相同的输入返回结果的微小变化?甚至一点点不同?

我正在模拟一个基本混乱的系统,我希望数据的微小变化会产生明显的影响。但是我希望,使用相同的数据,程序的行为将是固定的。不是这种情况。每次运行程序时,我都会看到明显但可以接受的差异。

我在想我在某处留下了一些未初始化的变量......

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

回答

罗素的回答是正确的。浮点运算是确定性的。非确定性是由悬空指针引起的。

4

2 回答 2

5

是的,这是可能的。引用C++ 常见问题解答

事实证明,在某些安装中,即使 x == y,cos(x) != cos(y) 也是如此。那不是错字。如果您不感到震惊,请再读一遍:某事物的余弦可能不等于同一事物的余弦。(或正弦,或正切,或对数,或任何其他浮点计算。)

为什么?

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

于 2012-07-15T07:04:52.843 回答
4

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

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

于 2012-07-15T08:03:32.527 回答