delphi - 是否可以清除FPU?

标签 delphi floating-point fpu

我正在使用Delphi XE6执行复杂的浮点计算。我意识到浮点数的局限性,因此了解FP数固有的不准确性。但是,在这种特殊情况下,我总是在计算结束时获得2个不同值中的1个。
第一个值和一会儿之后(我还没有弄清楚为什么和什么时候),它翻转到第二个值,然后除非重新启动应用程序,否则我将无法再次获得第一个值。由于计算非常复杂,所以我真的不能更具体。我几乎可以理解该值是否是随机的,但是只有2个不同的状态有点令人困惑。这仅在32位编译器中发生,无论我尝试多少次,64位编译器都会给出一个答案。这个数字不同于32位计算中的2,但是我知道为什么会发生这种情况,我对此表示满意。我需要一致性,而不是总准确性。
我的一个怀疑是,FPU可能在经过某种计算后仍处于某种状态,这会影响后续计算,因此,我提出了有关清除所有寄存器和FPU堆栈以平衡竞争环境的问题。在开始计算之前,我将其称为CLEARFPU。

经过更多调查后,我意识到我找错了地方。您所看到的不是浮点数所得到的。我一直在看数字的字符串表示形式,并认为这里有4个数字要进行计算ALL EQUAL,结果是不同的。原来,数字似乎是相同的。我开始记录这些数字的十六进制等效项,然后按原路返回,并发现用于矩阵乘法的外部dll导致了错误。我用用Delphi编写的例程替换了矩阵乘法,一切都很好。

最佳答案

浮点计算是确定性的。输入是输入数据和浮点控制字。使用相同的输入,相同的计算将产生可重复的输出。

如果您有无法预测的结果,那么将是有原因的。输入数据或浮点控制字都在变化。您必须诊断那是什么原因。在您完全理解问题之前,您不应该在寻找问题。在不了解疾病的情况下,请勿尝试使用膏药。

因此,下一步就是用简单的代码隔离并重现问题。重现问题后,就可以解决问题。

可能的解释包括使用未初始化的数据,或使用外部代码修改浮点控制字。但是可能还有其他原因。

未初始化的数据是合理的。可能更可能的是某些外部代码正在修改浮点控制字。检测您的代码以在执行的各个阶段记录浮点控制字,以查看其是否曾经意外更改。

关于delphi - 是否可以清除FPU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33527760/

相关文章:

delphi - 将当前日期(格式yyyy/mm/dd)插入列表框-

C++ STL make_heap 和priority_queue 给出不同的输出

javascript - UInt32、Int32、Float32的字节类型是什么?

delphi - FPU。如何制作一个循环?

c - 简单浮点运算的奇怪结果 - FPU 内部状态错误?

delphi - 函数结果中剩余的字符串

delphi - 使用 ADO 从另一个表上的查询创建新表

Delphi动态数组迭代和记录复制

php - 使用 (int) 和 (double) 一起截断小数时出错

assembly - 对汇编FLD指令m64fp感到困惑