Floating point 使用浮点转换从二进制到10进制的转换

Floating point 使用浮点转换从二进制到10进制的转换,floating-point,binary,computer-science,digital-logic,Floating Point,Binary,Computer Science,Digital Logic,这是我第一次发帖 这就是我的问题,我不理解下面的例子 二进制表示: 01000000011000000000000000000000000000 =+(1.11)base 2x 2^(128-127)首先,您要做的第一件事是分离字段(给定IEEE 754 32位浮点编码): 符号位:0 指数位:10000000 尾数位:11000000000000000 (128-127)通过减去指数偏差来计算指数 当从浮点转换为十进制时,可以对指数偏差进行细分。当以另一种方式转换时,可以添加它。指数偏差计算如

这是我第一次发帖

这就是我的问题,我不理解下面的例子

二进制表示: 01000000011000000000000000000000000000


=+(1.11)base 2x 2^(128-127)
首先,您要做的第一件事是分离字段(给定IEEE 754 32位浮点编码):

符号位:0

指数位:10000000

尾数位:11000000000000000

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

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

2^(k)−1) − 1,其中k是指数字段中的位数

2^(8 - 1) - 1 = 127
尾数为1.11,基数为2(二进制)。尾数由一个分数组成,并有一个隐含的前导1。因此,有11000。。。在尾数位,你有一个隐含的前导1给你1.11


如果尾数位是1011,那么分数的值将是1.011。本教程将使您更好地理解浮点:

二进制表示法分为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
在中,指数偏差为常数127。您给出的特定位模式以128(1000000)作为指数对浮点进行编码:

0 10000000 11000000000000000000000
s exponent fraction
首先看符号位,它是0。所以这是一个正数

然后从指数中减去指数偏差,这就是128-127的来源。这将产生
1

然后我们开始将分数中的位相加(
11000000000000000
):

给出1.75

现在我们有1(符号)*2^1(指数)*1.75(分数)=2*1.75=3.5

另一个例子:

00111110101010101010101010101011
细分:

0 01111101 01010101010101010101011
s exponent fraction
符号是0,所以它又是正数

125(011111101)指数,从中减去指数偏差:
125-127=-2

解码分数
01010101010101011

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.3333333 730697632
左右

现在将其全部添加到一起:

1(sign) * 2^-2(exponent) * 1.3333333730697632(fraction) = 0.25 * 1.3333333730697632 = 0.3333333432674408 =~ 0.3333333

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

如果将浮点解释为32位整数,则不更改顺序。
就是

float a,b;
断言((a
  • 因此,符号位首先出现,然后是指数,然后是尾数
  • 因此,最小正浮点数的指数为零
  • 因此,0.0编码时所有位都设置为0
因此,你必须减去127作为指数


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

顺便说一句,如果您不想手动执行分数解码
1(sign) * 2^-2(exponent) * 1.3333333730697632(fraction) = 0.25 * 1.3333333730697632 = 0.3333333432674408 =~ 0.3333333
float a,b;
assert((a < b) == ((int)(a) < (int)(b)));