42

我有这个关于如何将基数为 10 的数字转换为 IEEE 754 浮点表示的示例

Number: 45.25 (base 10) = 101101.01 (base 2) Sign: 0
Normalized form N = 1.0110101 * 2^5
Exponent esp = 5  E = 5 + 127 = 132 (base 10) = 10000100 (base 2)
IEEE 754: 0 10000100 01101010000000000000000

这对我来说很有意义,除了一段:

45.25 (base 10) = 101101.01 (base 2)

45 是二进制的 101101 ,这没关系..但是他们如何获得 0.25 作为 .01 ?

4

7 回答 7

125

简单的地方价值。在 base 10 中,你有这些地方:

... 10 3 10 2 10 1 10 0 10 -1 10 -2 10 -3 ...

……千、百、十、个。十分之一,百分之一,千分之一……

同样,在二进制(基数 2)中,您有:

... 2 3 2 2 2 1 2 0 2 -1 2 -2 2 -3 ...

... 八,四,二,一。一半,四分之一,八分之一...

所以.in 二进制之后的第二位是 2 -2的单位,众所周知,它是 1/4 的单位(或者,0.25)。

于 2013-03-07T22:18:30.707 回答
30

您可以通过重复乘以新基数(在本例中新基数为 2)将小数点后的部分转换为另一个基数,如下所示:

0.25 * 2 = 0.5

-> 第一个二进制数字为0(取整数部分,即小数点前的部分)。

继续乘以小数点后的部分:

0.5 * 2 = 1.0

-> 第二个二进制数字是 1(同样,取整数部分)。

这也是我们停止的地方,因为小数点后的部分现在为零,所以没有什么可以乘的了。

因此小数部分的最终二进制表示为: 0.01 2

编辑:

可能还值得注意的是,即使从以 10 为底的有限小数部分开始,二进制表示通常也是无限的。示例:将 0.2 10转换为二进制:

0.2 * 2 = 0.4   ->   0
0.4 * 2 = 0.8   ->   0
0.8 * 2 = 1.6   ->   1
0.6 * 2 = 1.2   ->   1
0.2 * 2 = ...

所以我们最终得到: 0.001100110011... 2

如果二进制表示最终是无限的,使用这种方法你很容易看到。

于 2013-03-07T22:20:10.533 回答
13

考虑到它们与整数的工作方式完全相同,其他基数中的“小数”(小数位)令人惊讶地不直观。

base 10
scinot 10e2  10e1  10e0 10e-1 10e-2 10e-3
weight 100.0 10.0   1.0  0.1   0.01  0.001
value  0     4      5     .2      5      0

base 2
scinot 2e6 2e5 2e4 2e3 2e2 2e1 2e0 2e-1 2e-2 2e-3
weight 64  32  16   8   4   2   1   .5   .25 .125
value   0   1   0   1   1   0   1   .0    1    0   

如果我们从 45.25 开始,它大于/等于 32,所以我们添加一个二进制 1,然后减去 32。
剩下 13.25,它小于 16,所以我们添加一个二进制 0。
剩下 13.25 ,它大于/等于 8,所以我们添加一个二进制 1,然后减去 8。
我们剩下 05.25,它大于/等于 4,所以我们添加一个二进制 1,然后减去 4。
我们剩下01.25 小于 2,所以我们添加一个二进制 0。
剩下的 01.25,大于/等于 1,所以我们添加一个二进制 1,然后减去 1。
对于整数,我们将有零离开了,所以我们停下来。但是:
我们剩下 00.25,它小于 0.5,所以我们添加一个二进制 0。
我们剩下 00.25,它大于/等于 0.25,所以我们添加一个二进制 1,然后减去 0.25。
我们有零,所以我们停止(或者不,如果你愿意,你可以继续计算零)

请注意,并非所有十进制的“简单”数字总是达到零停止点。0.1(十进制)转换为基数 2,无限重复:0.0001100110011001100110011 ...但是,二进制中的所有“简单”数字总是会很好地转换为基数 10。

您也可以对分数 (2.5)、无理数 (pi) 甚至虚数 (2i) 基数执行相同的过程,但基数不能介于 -1 和 1 之间。

于 2013-03-07T22:18:35.257 回答
11

2.000 10 = 2 +1 = 10.000 2
1.000 10 = 2 +0 = 01.000 2
0.500 10 = 2 -1 = 00.100 2
0.250 10 = 2 -2 = 00.010 2
0.125 10 = 2 -3 = 00.001 2

于 2013-03-07T22:17:56.587 回答
8

以 2 为底的分数是 .1 = 1/2, .01 = 1/4。...

于 2013-03-07T22:16:29.583 回答
4

这样想

(点) 2^-1 2^-2 2^-3 等

所以

. 0/2 + 1/4 + 0/8 + 0/16 等

http://floating-point-gui.de/formats/binary/

于 2013-03-07T22:23:09.500 回答
1

您可以将 0.25 视为 1/4。

除以 2 in(以 2 为底)将小数点左移一位,同样的方法除以 10 in(以 10 为底)将小数点左移一位。一般除以 M in (base M) 将小数点左移一位。

所以

base 10                  base 2
--------------------------------------
1                      =>      1
1/2 = 0.5              =>    0.1
0.5/2 = 1/4 = 0.25     =>   0.01 
0.25/2 = 1/8 = 0.125   =>  0.001
.
.
.

等等

于 2013-03-13T09:13:33.200 回答