IEEE754 标准定义了两类 NaN,静默 NaN,QNaN,和信令 NaN,SNaN。当 SNaN 加载到浮点寄存器中时,浮点单元会引发异常。
QNaN 可通过NaN
在Math
. 该常数的定义是:
const
NaN = 0.0 / 0.0;
我希望能够使用类似的东西来声明一个常量,它是一个信号 NaN,但还没有找到一种方法来做到这一点。
您可能会天真地编写以下代码:
function SNaN: Double;
begin
PInt64(@Result)^ := $7FF7FFFFFFFFFFFF;//this bit pattern specifies an SNaN
end;
但是浮点返回值的 ABI 意味着 SNaN 被加载到浮点寄存器中,以便可以返回。自然地,这会导致一个与目的相反的异常。
因此,您将被引导编写如下代码:
procedure SetToSNaN(out D: Double);
begin
PInt64(@D)^ := $7FF7FFFFFFFFFFFF;
end;
现在,这可行,但非常不方便。假设您需要将 SNaN 传递给另一个函数。理想情况下,您想写:
Foo(SNaN)
但你必须这样做:
var
SNaN: Double;
....
SetToSNaN(SNaN);
Foo(SNaN);
所以,在积累之后,问题来了。
有什么方法可以编写x := SNaN
并为浮点变量x
分配一个信号 NaN 的值?