(バッファ内の)80ビット拡張精度浮動小数点数をdoubleに変換しようとしています。バッファには基本的にx87レジスタの内容が含まれています。
私はIEEE標準にあまり精通していなかったので、この質問は私が始めるのに役立ちました。とにかく、私は80ビット形式の非正規化数(または非正規化数)に関する有用な情報を見つけるのに苦労しています。私が知っているのは、float32やfloat64とは異なり、仮数に隠しビットがない(1.0の暗黙の加算がない)ため、数値が正規化されているかどうかを知る1つの方法は、仮数の最上位ビットが設定されているかどうかを確認することです。 。それは私に次の質問を残します:
ウィキペディアの説明によると、float32とfloat64は、(バイアスされた)指数が0で、仮数がゼロ以外の非正規化数を示しています。
- それは80ビットのフロートで何を教えてくれますか?
- 仮数が1.0未満の80ビットフロートは、ゼロ以外の指数を持つこともできますか?
- あるいは、指数が0の80ビットフロートで仮数> = 1.0を使用することもできますか?
編集:私は質問が要約すると推測します:
FPUがx87レジスタの指数と最高仮数ビットをサニタイズすることを期待できますか?
そうでない場合、変換の結果はどのような数値になりますか?その場合、指数を完全に無視する必要がありますか?それともqNaNですか?
編集:
インテルのマニュアル(インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアル、第1巻:基本アーキテクチャー)のFPUセクションを読みましたが、これは私が恐れていたほど怖くありませんでした。結局のところ、次の値は定義されていません。
- 指数==0+最上位ビットが設定された仮数
- 指数!=0+最上位ビットが設定されていない仮数
これらの値が実際に表示される可能性があるかどうか、または内部で変換されるかどうかについては言及されていません。だから私は実際にOllydbgをほこりを払い、x87レジスタに手動でビットを設定しました。指数に設定されたすべてのビットと0の仮数を含むようにST(0)を作成しました。次に、実行させました。
FSTP QWORD [ESP]
FLD QWORD [ESP]
に格納された値[ESP]
は、シグナリングNaNに変換されました。の後にFLD
、ST(0)
静かなNaNが含まれていました。
それが私の質問に答えると思います。J-16 SDiZのソリューションは、最も単純なソリューションであるため、受け入れました(ただし、詳細の一部は明示的に説明されていません)。
とにかく、ケースは解決しました。みなさん、ありがとうございます。