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



我在Delphi Seattle中使用TFDTable组件。我在设计时保留了这个表组件。

执行时TFDTable(Compo)。打开

我在调试时出错(Ctrl+F7)";0042F353处的浮点不精确结果";

我在谷歌上搜索了一下,但找到了原因,但没有确切的答案。

有什么建议吗?

参考URL:

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

浮点不精确结果

这个例外表明你";精度损失";FPU中的掩码位已关闭常开。查找系统变量中的$0020位Default8087CW,并尝试在$0020中用Set8087CW(Default8087CW或$0020)语句。

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

有一个众所周知的问题,Default8087CW作为全局变量可能会被库甚至您自己的代码滥用,并随时更改,从而导致FP计算的意外结果或意外异常发生。8087 FPU Control word的六个最低位是异常掩码位,这意味着如果设置了一个位,则相应的异常被屏蔽,从而防止引发。

John Herbster所说的"精度损失"掩码位就是Delphis TArithmeticException枚举中名为exPrecision的位之一。此外,他建议通过调用Set8087CW(Default8087CW or $0020)来确保该比特被设置。由于您使用的是Delphi 10 Seattle,因此建议使用SetExceptionMask()函数(来自System.Math单元),因为它同样处理64位hw:上的相应SSE掩码

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

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

函数获取并返回一个TArithmeticExceptionMask(一组TArithmeticException)。所有其他异常枚举和FPU/SSE相关函数都在文档中。

最新更新