1

Intel の x86 コプロセッサを使用して行われた計算の結果を取得する方法を理解するのに苦労しています。

次のデータ セグメントを検討してください。

.data

res real4 ?
x real4 5.0
k real4 3.4

および次のコード セグメント、バージョン 1 :

.code

main:

fld x      ; 5.0
fadd k1    ; 5.0 + 3.4
fistp res  ; store as integer (it will round, in this case down)

mov eax, res ; eax = 00000008

end main

およびバージョン 2 :

.code

main:

fld x     ; 5.0
fadd k    ; 5.0 + 3.4
fstp res  ; store as real

mov eax, res ; eax = 41066666

end main

バージョン 1は問題なく理解できました。

わからないバージョン2です。デバッガーで、バージョン 1 とまったく同じ計算が行われていることがわかりますが、保存するときは "41066666" のようになります!?

これの理由は何ですか?
8.4 を「41066666」にするために使用された「エンコーディング」は何ですか?
コンソールに出力できるように (たとえば、StdOut masm32 ライブラリ関数を使用して) 8.4 に戻す方法はありますか?

ありがとう。

4

3 に答える 3

4

浮動小数点計算機およびコンバーター

8.4 と入力すると、数値の 16 進バージョンが 41066666 として表されることがわかります。

于 2010-01-20T04:50:21.583 に答える
3

0x41066666 IEEE-754単精度形式でエンコードされた8.4(正確には8.3999996185302734375)ですエンコーディングからコンポーネント フィールドを抽出することで、その値を 16 進数として簡単に表示できます0x8.66666。10 進出力が必要な場合、最も簡単な方法は、システムの C ライブラリにリンクしてprintf関数を使用することです。

または、wallykが提案したように、オープン ソースの変換ルーチンの 1 つのソースを取得します (または、独自の実装を作成しますが、これをうまく行うのは驚くほど困難なタスクです)。おそらく最も簡単にアクセスできるソースは、Netlibgdtoa.tgzのファイルにあります。その実装の複雑さは、関連する問題のいくつかのアイデアを提供するはずであり、ライブラリの使用に戻る可能性があります =)

于 2010-01-20T14:57:17.357 に答える
3

エンコードはIEEE-754浮動小数点形式です。単精度とも呼ばれる 32 ビット浮動小数点数を使用しているようです。この形式には、符号ビット、127 でバイアスされた 8 ビットの指数 (おそらく 128 です。覚えていないので覚えていません)、および 23 が格納されている 24 ビットの仮数が含まれており、欠落しているビットが最上位であり、通常は1 つ、デノーマル値を除く。特別な意味を持つパターンがいくつかあります: ゼロ、NaN、無限大、およびデノーマル。

CookieOfFortune によって提案された外部ツールに加えて、さまざまな算術演算を実行して値を決定することにより、ASCII への浮動小数点変換を記述することができます。スペースと速度をトレードオフするアルゴリズムは多数あります。のランタイム ライブラリ ソースftoa、または の %f または %g 変換を参照してくださいprintf()

于 2010-01-20T06:03:43.193 に答える