【发布时间】:2013-04-28 04:08:50
【问题描述】:
IEEE754 标准定义了两类 NaN,静默 NaN,QNaN,和信令 NaN,SNaN。当 SNaN 加载到浮点寄存器时,浮点单元会引发异常。
QNaN 可通过在 Math 中声明的名为 NaN 的常量用于 Delphi 代码。该常量的定义是:
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?
【问题讨论】:
-
您是否尝试过内联您的第一种方法?
-
@UweRaabe 事实上我有。我想让其他人写下这个答案,以便他们获得代表。我仍然对依赖内联感到有些不安。如果函数调用以某种方式没有内联,那么就繁荣了。
标签: delphi