7

(バッファ内の)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に変換されました。の後にFLDST(0)静かなNaNが含まれていました。

それが私の質問に答えると思います。J-16 SDiZのソリューションは、最も単純なソリューションであるため、受け入れました(ただし、詳細の一部は明示的に説明されていません)。

とにかく、ケースは解決しました。みなさん、ありがとうございます。

4

2 に答える 2

3

正常以下の80ビット数に関する情報を見つける際の問題は、8087がそれらに対して特別な非正規化を利用していないためである可能性があります。Type float(C)のMSDNページでこれを見つけました:

この表にリストされている値は、正規化された浮動小数点数にのみ適用されます。非正規化された浮動小数点数の最小値は小さくなります。80x87レジスタに保持される数値は、常に80ビットの正規化された形式で表されることに注意してください。数値は、32ビットまたは64ビットの浮動小数点変数(float型およびlong型の変数)に格納されている場合にのみ、非正規化形式で表すことができます。

編集

上記は、MicrosoftがFPUレジスタをどのように利用するかについて当てはまる可能性があります。これを示す別のソースが見つかりました:

FPUデータ型

80x87 FPUは通常、正規化された形式で値を格納します。浮動小数点数が正規化されると、HOビットは常に1になります。32ビットおよび64ビットの浮動小数点形式では、80x87は実際にはこのビットを格納せず、80x87は常にこのビットを1と見なします。したがって、32ビットおよび64ビットの浮動小数点数は常に正規化されます。拡張精度の80ビット浮動小数点形式では、80x87は仮数のHOビットが1であるとは想定せず、数値のHOビットはビット文字列の一部として表示されます。

正規化された値は、指定されたビット数に対して最高の精度を提供します。ただし、80ビット形式で表すことができる正規化されていない値が多数あります。これらの値はゼロに非常に近く、仮数HOビットがゼロではない値のセットを表します。80x87 FPUは、非正規化値と呼ばれる特殊な形式の80ビットをサポートします。

于 2011-08-06T14:30:04.703 に答える
3

SoftFloatライブラリを試してみてfloatx80_to_float32ください 。ネイティブ形式を検出し、それに応じて行動します。floatx80_to_float64floatx80_to_float128

于 2011-08-06T16:28:25.277 に答える