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

时间:2016-05-03 06:21:14

标签: delphi firedac

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

执行时 TFDTable(Compo)。打开

调试时出现错误(Ctrl + F7)" 0042F353"

浮点不准确的结果

我用谷歌搜索,但得到了理由,但没有得到它究竟是什么。

有什么建议吗?

参考网址:

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

  

浮点不精确的结果

     

这个例外暗示你有   "精度损失" FPU中的掩码位置OFF。它是   通常开。查找系统变量中的$ 0020位   默认8087CW并尝试使用a在$ 0020中进行OR运算   Set8087CW(Default8087CW或$ 0020)声明。

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

1 个答案:

答案 0 :(得分:1)

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

John Herbster所谈论的“精度损失”掩码位是其中一个位,在Delphis TArithmeticException enum中称为exPrecision。此外,他建议通过调用Set8087CW(Default8087CW or $0020)来确保设置此位。由于您使用的是Delphi 10 Seattle,因此建议使用SetExceptionMask()函数(来自System.Math单位),因为它同样处理64位hw上相应的SSE掩码:

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

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

该函数接受并返回TArithmeticExceptionMaskTArithmeticException的集合)。所有其他异常枚举和FPU / SSE相关函数都在documentation