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

Delphi中TFDTable组件中的浮点不精确结果异常,delphi,firedac,Delphi,Firedac,我正在Delphi西雅图使用TFDTable组件。我在设计时保留了这个表组件 执行时 TFDTable(复合)。打开 调试(Ctrl+F7)“0042F353处的浮点不精确结果”时出错 我在谷歌上搜索了一下,但找到了原因,但没有找到确切的原因 有什么建议吗 参考网址: 浮点不精确结果 这个例外表明你有 FPU中的“精度损失”掩码位已关闭。它是 通常是开着的。在系统变量中查找$0020位 Default8087CW,并尝试使用 Set8087CW(默认8087CW或$0020)语句 有一个众所周

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

执行时 TFDTable(复合)。打开

调试(Ctrl+F7)“0042F353处的浮点不精确结果”时出错

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

有什么建议吗

参考网址:

浮点不精确结果

这个例外表明你有 FPU中的“精度损失”掩码位已关闭。它是 通常是开着的。在系统变量中查找$0020位 Default8087CW,并尝试使用 Set8087CW(默认8087CW或$0020)语句


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

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

var
  OldExceptionMask: TArithmeticExceptionMask;
...
OldExceptionMask := SetExceptionMask(GetExceptionMask + [exPrecision]);
TFDTable(Compo.Open)之前调用上述函数应该可以解决您的问题


该函数获取并返回一个
TarithmeticeException任务
(一组
TarithmeticeException
)。所有其他异常枚举和FPU/SSE相关函数都在中。

您没有得到的确切信息是什么?请更具体一点,复制粘贴你想要参考的相关行(保留源链接)。如果没有相关的文本,你的问题可能对未来的读者毫无价值。在国际海事组织,我相信你提到的文本清楚地说明了它是关于什么的。你使用的是什么驱动程序?您返回的数据的性质是什么?对于任何一个表,或者仅仅对于一个特定的表,您会得到这个错误吗?您是否尝试过在没有任何数据的情况下打开该表的副本?问题可能是驱动程序、您试图打开的表中不支持的功能或表中处理不正确的值。您需要在q中显示一些真实代码,并提供足够的详细信息,以便读者在需要帮助时重现您的问题。TFDTable(Compo).Open显然不是真正的代码。@MartynA:很抱歉延迟回复。有一个表只有不到20行,其中有一个数字列,还有其他列以及其他数据类型。@汤姆:我没有得到这个点,“>然后作为“浮点不精确结果->此异常表明FPU中的“精度损失”掩码位已关闭。它通常是开着的。在系统变量Default8087CW中查找$0020位,并尝试使用Set8087CW(Default8087CW或$0020)语句将$0020中的ORing输入到控制字中。"