在二进制表示法中,小数点后的数字代表什么意思?

42

我有一个关于如何将十进制数转换为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 呢?

7个回答

124

简单的位值表示法。在十进制中,有以下几个位置:

... 103 102 101 100 . 10-1 10-2 10-3 ...

... 千位数、百位数、十位数、个位数 . 十分位数、百分位数、千分位数 ...

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

... 23 22 21 20 . 2-1 2-2 2-3 ...

... 八分之一、四分之一、二分之一、一 ... 半、四分之一、八分之一 ...

因此,在二进制下小数点后的第二位是2的负二次幂单位,也就是您熟知的四分之一单位(或者另一种表示方法是0.25)。


3
+1,虽然我发现将二进制位称为“八、四…”有些滑稽,因为每个位置上从未超过一个这样的值。 - David Kaczynski
1
@David,你说得很好。我在那里犹豫不决,但我选择使用复数形式来匹配常见的十进制用法,希望能使解释易于理解。 - Carl Norum

30

你可以通过反复乘以新进制(在这种情况下,新进制为2)来转换小数点后面的部分,例如:

0.25 * 2 = 0.5

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

继续用小数点后面的部分进行乘法:

0.5 * 2 = 1.0

第二个二进制位是1(再次取整数部分)。

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

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

编辑:

值得注意的是,即使在十进制中从有限小数开始,其二进制表示通常也是无限的。例如:将0.210转换为二进制:

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

使用这种方法,您可以很容易地看出二进制表示是否无限。


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(十进制)转换为二进制,会无限重复:0.0001100110011001100110011... 但是,所有二进制中的“易处理”数字都将很好地转换为十进制。

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


但是我们不能比较虚数,对吧? - Rotsor
1
@Rotsor:我认为我们可以,只是我不知道怎么做。Knuth找出了如何使用无理数基数的方法:http://en.wikipedia.org/wiki/Quater-imaginary_base - Mooing Duck
@Rotsor和Mooing Duck:Rotsor的观点是正确的,因为数学不等式(<、>、<=、>=)并没有针对复数定义。解决这个问题的方法是使用Knuth的四元虚数基作为复数可以在该基中用单个术语来表示(例如7 + 4i(基数10)= 10323(基数2i))。然而,十进制基数中的比较结果并不总是与四元虚数相同。例如:0 > -4(基数10),而0 < 1000(基数2i)。 (-4(基数10)= 1000(基数2i)) - nijoakim
@nijoakim:很高兴知道数学不等式没有定义,并且“显而易见”的方法与有理数的比较不匹配。然而,我仍然相信可能存在一种有意义的方法。 - Mooing Duck
@MooingDuck:是的,我同意这是完全可能的。自从你发布了这个问题后,我一直在尝试解决它,但结果证明这相当困难。 - nijoakim

11
<最初的回答>

2.00010 可以表示为 2 的一次方,二进制下为 10.0002
1.00010 可以表示为 2 的零次方,二进制下为 01.0002
0.50010 可以表示为 2 的负一次方,二进制下为 00.1002
0.25010 可以表示为 2 的负二次方,二进制下为 00.0102
0.12510 可以表示为 2 的负三次方,二进制下为 00.0012


8

二进制小数可以表示为.1 = 1/2,.01 = 1/4。...


4

1
你可以把0.25看作1/4。
在(二进制)中除以2会使小数点向左移动一位,就像在(十进制)中除以10会使小数点向左移动一位一样。通常,在(M进制)中除以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
.
.
.

等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接