我和我的博士 学生在物理数据分析环境中遇到了一个问题,我可以使用一些洞察力.我们的代码可以分析来自LHC实验之一的数据,从而产生不可重复的结果.特别地,在相同机器上运行的相同二进制获得的计算结果可以在连续执行之间不同.我们知道许多不同的不可再生性来源,但已排除了通常的嫌疑人.
在比较名义上具有相同值的两个数字时,我们已经将问题跟踪到(双精度)浮点比较运算的不可再现性.由于分析中的先前步骤,偶尔会发生这种情况.我们刚刚找到一个示例来测试一个数字是否小于0.3(请注意,我们永远不会测试浮点值之间的相等性).事实证明,由于探测器的几何形状,计算有可能偶尔产生精确到0.3(或其最接近的双精度表示)的结果.
我们非常清楚比较浮点数以及FPU中过度精度可能影响比较结果的缺陷.我想回答的问题是"为什么结果不可复制?" 是因为FPU寄存器加载或其他FPU指令没有清除多余的位,因此先前计算中的"剩余"位会影响结果吗?(这似乎不太可能)我在另一个论坛上看到一个建议,即进程或线程之间的上下文切换也可能导致浮点比较结果的变化,因为FPU的内容存储在堆栈中,因此被截断.任何关于这些=或其他可能的解释的评论将不胜感激.