0

10 進数を IEEE 754 単精度浮動小数点表現に変換する方法は知っていると思いますが、確認したいと思います。

IEEE 754 単精度浮動小数点表現で 3.398860921 x 10^18 を表現したい。フロート担当者を知っています。壊れています。

31 桁目: 符号 (+ の場合は 0、- の場合は 1) 30 ~ 23 桁目: 指数を表す 22 ~ 0 桁目: 仮数 (仮数) を表す

正の数なので、符号は明らかに 0 です。指数については、これを思いつき(バイアスの127に18を追加することにより)、指数を次のように表しました:1001 0001

3.398860921 の部分となる仮数部については、小数点の右側にあるすべてのものを継続的に 2 で乗算し、それが 1 より大きい場合は 1 をマークし、それ以外の場合は 0 をマークしました。仮数部を埋めるのに十分なビットを思いつくまで、小数点以下 2 を 2 ずつ増やしました。

だから今私は持っています: 0 | 1001 0001 | 0110 0110 0001 1011 1011 111

これを HEX に変換すると 0x48B30DDF が得られますが、これは 3.398860921 x 10^18 で始めた数値とは異なります。

そんなはずなのか、どこかで間違えたのか。どんな助けでも大歓迎です。

4

1 に答える 1

1

IEEE 754 表現に 10 進指数を使用することはできません。IEEE 754 は 2 進数の指数、つまり、数値が 1.xxx… * 2 pとして表される場合の数値 p を想定しています。

また、直接使用できない 10 進指数に関連してのみ意味があるため、2 進数に直接変換された 10 進指数表記の仮数を使用することはできません。

アルゴリズムは、数値全体を 2 進数に変換してから、仮数部のみを先頭のビットに続く 23 ビットを取得することです。指数は先頭ビットの位置を数えます。

Wolfram Alphaによると、特定の値 3.398860921 x 10 18の場合、バイナリ表現は 1.011110010101100101101111111111101101001010010111101×2 61です。

これは、偏りのない指数が61であり、先行ビットが省略された仮仮数が であることを意味し01111001010110010110111ます。10 進数から浮動小数点数への変換の誤差は 0.000000000000000000000011111111101101001010010111101×2 61として計算できます。この誤差は ULP の半分よりも大きいため、切り捨てたくない理由がない限り、有効桁数に 1 を追加する必要があります。 10 進数で表された元の数値に最も近い単精度値を取得します。

于 2013-11-05T01:06:27.433 に答える