CLI 仕様の Ecma 335 では、3 つの浮動小数点型が定義されています。Float32、float64、および F。最初の 2 つは公称型で、3 番目は表現型であり、IL の「ネイティブ float」型です。
セクションI.12.1.3「浮動小数点データ型の処理」では、次の理由が説明されています。
浮動小数点数 (静的、配列要素、およびクラスのフィールド) の格納場所は固定サイズです。サポートされているストレージ サイズは、float32 と float64 です。それ以外の場所 (評価スタック、引数、戻り値の型、およびローカル変数) の浮動小数点数は、内部浮動小数点型を使用して表現されます。そのような各インスタンスでは、変数または式の公称型は float32 または float64 のいずれかですが、その値は追加の範囲や精度で内部的に表すことができます。内部浮動小数点表現のサイズは実装に依存し、変化する可能性があり、表現される変数または式と少なくとも同じ精度を持つ必要があります。
これは現在のジッター実装には実際には存在せず、引数とローカル変数は実際には float32 または float64 のいずれかです。しかし、それにはいくつかの前例があり、彼らが最初にこれを考慮した考えられる理由は、Intel プロセッサの内部 FPU レジスタが 80 ビットであることです。これは、Intel が 8087 コプロセッサを設計した何ヶ月も前に下された設計上の決定でした。
紙の上では非常に良いアイデアに思えますが、中間計算結果をより正確に保存できるようにすることで、計算の最終結果をより正確にすることができました。しかし、間違いなく Intel の 10 億ドルの間違いでした。FPU を最適化することは不可能であり、それでも一貫した浮動小数点の結果を可能にします。問題は、内部 FPU レジスタが限られたリソースであり、8 つしかないことです。また、スタックとして実装されているため、扱いが非常に厄介です。計算が関係する場合、必然的に中間結果をメモリにスピルする必要があります。80 ビット値を 64 ビットに切り捨てます。計算で多くの有効桁数が失われる傾向がある場合、コードに小さな変更を加えると、計算結果に大きな違いが生じます。または、16 桁目が「
さて、大きな間違いであり、SO での膨大な数の質問の原因です。Intel が次世代の浮動小数点ハードウェアを実装したときに、このアイデアは破棄されました。XMM および YMM レジスタは 64 ビットです。スタックではなく、真のレジスター。x64 ジッターはそれらを使用します。プログラムを 64 ビット モードで実行すると、32 ビット モードで実行した場合とは異なる結果が生成されます。痛みがなくなるまでには、さらに10年かかります。