IEEE754標準では、2つのクラスの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
にシグナリングNaNの値が割り当てられる方法はありますか?
最初のアプローチをインライン展開しようとしましたか? –
@UweRaabe実際に私は持っています。私は誰か他の人がその回答を書くようにして、担当者を得ることができるようにしたかったのです。私はインライン展開に頼っても少し不安です。関数呼び出しが何らかの形でインライン化されていない場合は、ブームします。 –