IEEE 754標準では、16,777,214個の32ビット浮動小数点値がNaN、つまりすべての可能な値の0.4%として定義されているようです。
非常に多くの有用な値を予約する理由は何でしょうか。基本的に必要なのは、シグナリング用と静かなNaN用の2つだけです。
この質問が些細なものである場合は申し訳ありませんが、インターネット上で説明を見つけることができませんでした。
IEEE-754標準では、NaNを、すべて1が指数であり、ゼロ以外の仮数を持つ数値として定義されています。仮数の最上位ビットは、NaNがシグナリングであるかクワイエットであるかを指定します。仮数の残りのビットは、NaNのペイロードと呼ばれるものを形成します。
演算のオペランドの1つがNaNである場合は常に、結果はNaNであり、結果のペイロードはNaNオペランドの1つのペイロードと等しくなります。ペイロードの保存は 科学計算の効率 にとって重要であり、 少なくとも1つの会社 は独自の用途にNaNペイロードを使用することを提案しています。
より基本的には、NaNは有用な数値情報を伝達せず、32ビット全体を予約する必要があるため、標準で定義されたペイロードがない場合、仮数の未使用ビットは無駄になります。
IEEE-754フォーマットの設計者の1人である William Kahanによるこの一連のメモ によると、複数のNaNの使用は、ハードウェアが最初にNaNをトリガーしたものに関する情報を入力できるようにすることを目的としていました。最終的にNaNになる計算が完了するまで実行され、プログラマーがコードを記述して何が悪かったのかを分析できるようにします。
IEEE 754のNaNの仕様は、ソフトウェアがNaNの発生方法や場所などを記録できるビットフィールドを備えています。その情報は、その後の誤動作した計算の「遡及的診断」に非常に役立ちますが、現在、それを使用するソフトウェアは存在しません。通常、そのフィールドは、オペランドNaNからすべての算術演算の結果NaNにコピーされるか、トラップされていないINVALID演算によって新しいNaNが作成されたときにバイナリ1000 ... 000で埋められます。それを悪用するソフトウェアが不足しているため、その習慣は衰退しています。
したがって、これは意図的なものであり、特定されていないため、システムごとに処理方法が異なるようです。振り返ってみると、これが実際に起こったことはなかったようですが、それは合理的な考えのようです!
同様に、64ビット浮動小数点数のペイロードもあり、可能な値は約10 ^ 15です。残念ながら、実装では、ペイロードを32ビットと64ビットの浮動小数点数の間で転送し、元に戻す方法、つまり、最上位ビットと最下位ビットのどちらを保持するかについては異なります。ペイロードの処理はマシン固有であるため、異なるマシンでペイロードを処理するには異なるコードが必要です。
二項演算の後にどのNaNペイロードが伝播されるかについてはあまり心配しません。 NaNは、低い確率で発生する例外的な値であり、そのうちの2つを取得する可能性はほとんどありません。