Floating point 使用浮点转换从二进制到10进制的转换
这是我第一次发帖 这就是我的问题,我不理解下面的例子 二进制表示: 01000000011000000000000000000000000000Floating 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)通过减去指数偏差来计算指数 当从浮点转换为十进制时,可以对指数偏差进行细分。当以另一种方式转换时,可以添加它。指数偏差计算如
=+(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
编辑:该不等式适用于常规浮点运算,但不适用于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)));