使用浮点转换从二进制转换为基数10

时间:2012-08-13 17:34:57

标签: floating-point binary computer-science digital-logic

这是我第一次发帖。

所以这是我的问题,我不明白以下的例子。

二进制表示: 01000000011000000000000000000000

=+(1.11)base 2x 2^(128-127)< -all questions引用此行。

=+(1.11)base 2 x2^1

=+(11.1) base 2

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

问题: 128-127来自哪里?
为什么是1.11?

4 个答案:

答案 0 :(得分:2)

single precision floating point format中,指数偏差是常数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

答案 1 :(得分:0)

首先,您要做的第一件事就是将字段分开(给定IEEE 754 32位浮点编码):

  

符号位:0

     

指数位:10000000

     

尾数位:11000000000000000000000

(128 - 127)通过减去指数偏差来计算指数。

从浮点数转换为十进制数时,可以减去指数偏差。转换另一种方式时,添加它。指数偏差计算如下:

2 ^(k-1) - 1其中 k 是指数字段中的位数。

2^(8 - 1) - 1 = 127

尾数是1.11作为基数2(二进制)。尾数由一个分数组成,并具有一个隐含的前导1.因此,在尾数位中有11000 ...,你有一个隐含的前导,给你1.11

如果尾数位为1011,则分数值为1.011

答案 2 :(得分:0)

本教程可以让您更好地理解浮点:

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

二进制表示分为3部分:1个符号位,8个指数位和23个尾数位。

   0|10000000|11000000000000000000000
sign|exponent|       mantissa

符号位为零,表示它是正数。根据定义,指数(128)比实际值大127,解析为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

答案 3 :(得分:0)

我认为在指数中存在偏差(+127)的理由是:

如果将float解释为32位整数,则不要更改顺序 那是

float a,b;
assert((a < b) == ((int)(a) < (int)(b)));
  • 因此,首先是符号位,然后是指数,然后是尾数
  • 因此,最小的正浮点数具有零指数
  • 因此,0.0被编码为所有位设置为0

因此,您必须通过减去127 ...

来对指数进行去除

编辑:不等式适用于常规浮点数,但不适用于NaN