web-dev-qa-db-ja.com

JSエンジンはNaNのビットを変更できますか?

JavaScriptでは、NaN値は、内部的には広範囲の64ビットdoubleで表すことができます。具体的には、次のビットごとの表現を持つ任意のdouble:

x111 1111 1111 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx

NaNとして解釈されます。私の質問は、ArrayBuffersを使用して2つの32ビットuintをJS番号にキャストし、それを渡してから、2つの32ビットuintにキャストするとします。復元されたビットは元のビットと同じですか、それともJSエンジンはNaNのビットを自由に変更できますか?言い換えれば、JS番号を使用して64ビットを無損失で格納できますか?

12
MaiaVictor

私はかつて 質問 についてJavaに対してNaN値のハードウェア依存性について尋ねましたが、一部のCPUは「シグナリングNaN」を「静かなNaN」に静かに変換することに気付きました(静かなNaNビットを設定します) )NaN値がプロセッサレジスタにロードされたとき。 そのため、ビットの少なくとも1つであるクワイエットNaNビットを使用して、任意のデータを格納することはできません。

他のビットの使用は、クワイエットNaNビットが設定されている限り、おそらく安全です。しかし、それでもここには実装依存の余地があるようで、保証はありません。

この種の問題は、通常の言語操作がNaNの内部値に依存する処理を一切行わず、すべてのNaNを「単なるNaN」として扱うことを好む理由です。

1
Boann

元のIEEE-754標準では、意図的にNaNのビットを実装に任せていました。次のようなヒントを提供しました

NaNが作成された元のメモリアドレスを入力する場合があります。

一方、算術にはNaNの処理方法に関する特定のルールがあり、それは下部のビットとは何の関係もありません。 2つのNaNを追加するときに何をすべきかについても説明していません-別のビットのセットを構成するのではなく、そのうちの1つからビットを保持してください。結果はまだNaNでなければなりません。

0
Rick James