1

以下は、私が従おうとしているチュートリアルです。

数値をバイナリ表現に変換しようとすると、間違ってしまいます。誰かが私が間違っていることを教えてもらえますか?

-0.21875

バイナリ表現:

.00111 = 1.11 * 2^-3

以来..

0.5^3 + 0.5^4 + 0.5^5 = 0.21875

の指数で..

-3 + 127 = 124

したがって、バイナリ表現は次のようになります。

s eeeeeeee mmmmmmmmmmmmmm
1 01111100 11100000000000

しかし、なぜ 639.6875 を同じように変換すると正しい答えが得られるのでしょうか?

整数値の表現:

1001111111

10 進数値の表現:

1011

結合と正規化:

1001111111.1011 = 1.0011111111011 * 2^9

正規化するとき、基数を最初の 1 の右側に直接配置しますか? 指数に 127 をバイアスすると、127+9 = 136 になります。

10001000

バイナリ表現:

s eeeeeeee mmmmmmmmmmmmmm
0 10001000 10011111111011
4

1 に答える 1

0

最初の値

(言い換え) -0.21875 をバイナリに戻すと、間違った答えが得られます。なんで?

正規化された浮動小数点数の場合、先頭の「1」はビット表現に書き込まれません。たとえば、2 進数 1.0001101 をエンコードすると、仮数は 0001101(...) になります。

正規化された FP 数に関するこの事実は、投稿したプレゼンテーション スライドで説明されています。つまり、(1 + f)(単に ではなくf) と呼ばれる部分です。

したがって、-0.21875 のバイナリ表現には仮数ビットが必要です11000000000000000000000(23 ビット長になるまで右側にパディングされます)。

2 番目の値

しかし、なぜ 639.6875 を同じように変換すると正しい答えが得られるのでしょうか?

正しい答えが得られません。639.6875 の正しい表現は次のとおりです。

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 10001000 00111111110110000000000

コードチェック

これらの値は、Java を使用して簡単に確認できます。

printFloat(0b1_01111100_11000000000000000000000);  // -0.21875
printFloat(0b0_10001000_00111111110110000000000);  // 639.6875
printFloat(0b0_10001000_10011111111011000000000);  // 831.84375

void printFloat(int bits) { 
    System.out.println(Float.intBitsToFloat(bits));
}

訂正

この行の意図がわかります。

0.5^3 + 0.5^4 + 0.5^5 = 0.21875

しかし、それは次のように書かれるべきです:

0.5 * 2^-3 + 0.5 * 2^-4 + 0.5 * 2^-5 = 0.21875
于 2016-02-21T04:50:28.463 に答える