理論的には、すべての通常のシングルは、指数と仮数をパディングして倍精度を作成し、パディングを削除して元のシングルに戻すことができます。
理論から現実に移行するとき、問題が発生します。あなたが理論や実装に興味を持っていたかどうかはわかりません。それが実装であれば、すぐにトラブルに巻き込まれる可能性があります。
IEEEは恐ろしいフォーマットです。私の理解では、IEEEは意図的に非常にタフに設計されているため、誰もそれに対応できず、市場がIntelに追いつくことができず(これは少し前のことです)、より多くの競争を可能にしています. それが本当なら、失敗しました。いずれにせよ、この恐ろしい仕様で立ち往生しています。TI 形式のようなものは、現実の世界では非常に多くの点ではるかに優れています。私はどちらの会社にも、これらの形式のいずれにも関係がありません。
この仕様のおかげで、実際に (ハードウェアまたはハードウェアとオペレーティング システムで) 満たす fpu はほとんどなく、次世代では失敗することがよくあります。(グーグル: TestFloat)。最近の問題は、上で指定したように、single から double および double から single ではなく、int から float および float から int にある傾向があります。もちろん、その変換を行うためにfpuが実行する操作は何ですか? 0 を追加しますか? 1倍?fpu とコンパイラに依存します。
上記の質問に関連するIEEEの問題は、すべての数値ではなく、多くの数値を表すことができる数ではなく、複数の方法があることです。コードを壊したい場合は、2 つの操作のいずれかでプラス ゼロに変換されることを期待して、マイナス ゼロから始めます。次に、デノーマルを試します。そして、それはシグナリング nan で失敗するはずですが、あなたはそれを既知の例外として呼び出しました。
問題は、等号です。これは浮動小数点数に関するルール 1 であり、等号は決して使用しないでください。Equals は値比較ではなくビット比較です。2 つの値が異なる方法で表されている場合 (プラス ゼロとマイナス ゼロなど)、同じ数であってもビット比較は失敗します。大なり小なりは fpu で行われ、等号は整数 alu で行われます。
問題を説明するために equal を使用した可能性があり、必ずしも成功または失敗したいコードを使用したとは限りません。