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 一个 TArithmeticExceptionMask
(TArithmeticException
的集合)。所有其他异常枚举和 FPU/SSE 相关函数都在 documentation.
中
我在 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 一个 TArithmeticExceptionMask
(TArithmeticException
的集合)。所有其他异常枚举和 FPU/SSE 相关函数都在 documentation.