Delphi 中 TFDTable 组件中的浮点不精确结果异常

Floating point inexact result exception in TFDTable Component in Delphi

我在 Delphi 西雅图使用 TFDTable 组件。我在设计时保留了这个 table 组件。

执行时 TFDTable(Compo).Open

我在调试 (Ctrl +F7) 时遇到错误“0042F353 处的浮点结果不准确”

我用谷歌搜索了一下,找到了原因,但没弄明白到底是什么。

有什么建议吗?

引用URL:

http://www.delphigroups.info/2/e8/524771.html

Floating Point inexact result

This exception suggests that you have the "loss of precision" mask bit in the FPU turned OFF. It is normally ON. Look for the [=11=]20 bit in the system variable Default8087CW and try ORing in [=11=]20 into the control word with a Set8087CW(Default8087CW or [=11=]20) statement.

http://www.umiacs.umd.edu/~resnik/ling645_sp2002/cmu_manual/node19.html

有一个众所周知的问题,即 Default8087CW 作为全局变量可能会被库甚至您自己的代码滥用,并随时以导致 FP 计算的意外结果或意外异常的方式进行更改发生。 8087 FPU的最低六位Control word是exception mask位,意思是如果设置了一个位,对应的exception是masked,即被阻止提出。

John Herbster 所说的 "loss of precision" 掩码位就是其中之一,在 Delphis TArithmeticException 枚举中称为 exPrecision。此外,他建议通过调用 Set8087CW(Default8087CW or [=15=]20) 来确保设置此位。由于您使用的是 Delphi 10 Seattle,因此建议改用 SetExceptionMask() 函数(来自 System.Math 单元),因为它同样处理 64 位硬件上相应的 SSE 掩码:

var
  OldExceptionMask: TArithmeticExceptionMask;
...
OldExceptionMask := SetExceptionMask(GetExceptionMask + [exPrecision]);

TFDTable(Compo).Open 之前调用上面的方法应该可以解决您的问题。

该函数取 returns 一个 TArithmeticExceptionMaskTArithmeticException 的集合)。所有其他异常枚举和 FPU/SSE 相关函数都在 documentation.