IEEE754標準定義了兩類NaN,安靜的NaN,QNaN和信令NaN,SNaN。當SNaN被加載到浮點寄存器中時,浮點單元會引發異常。如何使信令NaN容易使用?
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
分配的值是一個信號喃?
你有沒有嘗試內聯你的第一種方法? – 2013-04-27 08:04:06
@UweRaabe其實我有。我想讓其他人寫出答案,以便他們能得到代表。依靠內聯,我仍然有點不安。如果函數調用不是內聯的,那麼繁榮。 – 2013-04-27 08:21:13