0

初めての投稿です。

ここに私の問題があります。次の例がわかりません。

バイナリ表現: 0100000001100000000000000000000

=+(1.11)base 2x 2^(128-127)<-すべての質問はこの行を参照します。

=+(1.11)base 2 x2^1

=+(11.1) base 2

=+(1x21+1x20+1x2-1)=(3.5) base 10

質問: 128-127 はどこから来たのですか?
なぜ1.11なのですか?

4

4 に答える 4

2

単精度浮動小数点形式では、指数バイアスは定数127です。また、指定した特定のビットパターンは、指数として128(1000000)の浮動小数点数をエンコードします。

0 10000000 11000000000000000000000
s exponent fraction

最初に符号ビットを見てください。0です。したがって、正の数です。

次に、指数から指数バイアスを減算します。指数は、128〜127の元になります。これはを与え1ます。

次に、小数部のビットを一緒に追加し始めます(11000000000000000000000):

1 + 0.5 + 0.25 + 0 + 0 + 0....

1.75を与える

これで、1(符号)* 2 ^ 1(指数)* 1.75(分数)= 2 * 1.75=3.5になります。

もう一つの例:

00111110101010101010101010101011

分解してください:

0 01111101 01010101010101010101011
s exponent fraction

符号は0なので、再び正の数になります。

125(01111101)指数、指数バイアスを減算します。125 - 127 = -2

分数をデコードする01010101010101010101011

1 + 0 + 0.25 + 0 + 0.0625 + 0 + 0.015625 + 0 + 0.00390625 + 0 + 0.0009765625 + 0 + 0.000244140625 + 0 + 0.00006103515625 + 0 + 0.0000152587890625 + 0 + 0.000003814697265625 + 0 + 9.5367431640625e-7 + 0 + 2.384185791015625e-7 + 1.1920928955078125e-7

これは1.3333333730697632かそこらを与えます。

今それをすべて一緒に追加します:

1(sign) * 2^-2(exponent) * 1.3333333730697632(fraction) = 0.25 * 1.3333333730697632 = 0.3333333432674408 =~ 0.3333333
于 2012-08-13T18:11:32.970 に答える
0

まず、最初に行う必要があるのは、フィールドを分離することです(IEEE 754 32ビット浮動小数点エンコーディングの場合)。

符号ビット:0

指数ビット:10000000

仮数ビット:11000000000000000000000

(128-127)は、指数バイアスを減算して指数を計算しています。

浮動小数点から小数に変換するときは、指数バイアスをサブラクトします。逆に変換する場合は、追加します。指数バイアスは次のように計算されます。

2 ^(k-1)− 1ここで、kは指数フィールドのビット数です。

2^(8 - 1) - 1 = 127

仮数は基数2(2進数)として1.11です。仮数は分数で構成され、暗黙の先頭1があります。したがって、仮数ビットに11000 ...があると、暗黙の先頭が1.11になります。

仮数ビットが1011だった場合、分数の値は1.011になります。

于 2012-08-13T18:10:07.250 に答える
0

このチュートリアルでは、フローティングポイントについての理解を深めることができます。

http://www.tfinley.net/notes/cps104/floating.html

バイナリ表現は、1つの符号ビット、8つの指数ビット、および23の仮数ビットの3つの部分に分けられます。

   0|10000000|11000000000000000000000
sign|exponent|       mantissa

符号ビットはゼロであり、正の数であることを意味します。定義上、実際の値より127大きい指数(128)は、1(つまり、128〜127)に解決されます。仮数は1.11です(先頭の1は、定義上、暗黙的に示されています)。したがって、

  01000000011000000000000000000000
= +(1.11)base 2 x 2^(128-127)
= (2^0 + 2^-1 + 2^-2) x 2^1
= 2^1 + 2^0 + 2^-1
= 2 + 1 + 0.5
= 3.5
于 2012-08-13T18:10:16.753 に答える
0

指数にバイアス (+127) がある理由は次のとおりだと思います。

float を 32 ビット整数として解釈する場合は、順序を変更しません。
あれは

float a,b;
assert((a < b) == ((int)(a) < (int)(b)));
  • その結果、最初に符号ビット、次に指数、次に仮数が来ます。
  • したがって、最小の正の float の指数はゼロになります。
  • したがって、0.0 はすべてのビットが 0 に設定されてエンコードされます。

したがって、127 を引いて指数をデバイアスする必要があります...

編集:不等式は通常のフロートでは機能しますが、NaNでは機能しません

于 2012-08-14T07:24:42.503 に答える