我在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
答案 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
之前调用上述内容可以解决您的问题。
该函数接受并返回TArithmeticExceptionMask
(TArithmeticException
的集合)。所有其他异常枚举和FPU / SSE相关函数都在documentation。