在不涉及不必要的细节的情况下,浮点数 (x86_64) 上的操作是否有可能基于相同的输入返回结果的微小变化?甚至一点点不同?
我正在模拟一个基本混乱的系统,我希望数据的微小变化会产生明显的影响。但是我希望,使用相同的数据,程序的行为将是固定的。不是这种情况。每次运行程序时,我都会看到明显但可以接受的差异。
我在想我在某处留下了一些未初始化的变量......
我使用的语言是 C++ 和 Python。
回答
罗素的回答是正确的。浮点运算是确定性的。非确定性是由悬空指针引起的。
在不涉及不必要的细节的情况下,浮点数 (x86_64) 上的操作是否有可能基于相同的输入返回结果的微小变化?甚至一点点不同?
我正在模拟一个基本混乱的系统,我希望数据的微小变化会产生明显的影响。但是我希望,使用相同的数据,程序的行为将是固定的。不是这种情况。每次运行程序时,我都会看到明显但可以接受的差异。
我在想我在某处留下了一些未初始化的变量......
我使用的语言是 C++ 和 Python。
罗素的回答是正确的。浮点运算是确定性的。非确定性是由悬空指针引起的。
是的,这是可能的。引用C++ 常见问题解答:
事实证明,在某些安装中,即使 x == y,cos(x) != cos(y) 也是如此。那不是错字。如果您不感到震惊,请再读一遍:某事物的余弦可能不等于同一事物的余弦。(或正弦,或正切,或对数,或任何其他浮点计算。)
为什么?
[F] 浮点计算和比较通常由通常包含特殊寄存器的特殊硬件执行,并且这些寄存器的位数通常多于双精度数。这意味着中间浮点计算通常具有比 sizeof(double) 更多的位,并且当浮点值写入 RAM 时,它通常会被截断,通常会丢失一些位精度。
康特拉托马斯的回答,浮点运算不是非确定性的。它们非常微妙,但是给定的程序应该为相同的输入提供相同的输出,如果它不使用未初始化的内存或故意随机化的数据。
我的第一个问题是,您所说的“相同数据”是什么意思?这些数据是如何进入你的程序的?