# 二进制小数的表示

与十进制小数一样,二进制小数点左边为正幂,小数点右边为负幂,幂的底数为 2。

# 二进制小数与十进制转换

二进制转十进制

二进制 (101.11)2(101.11)_2 表示数字 1×22+0×21+1×20+1×21+1×22=4+0+1+12+14=534=5.751\times2^2+0\times2^1+1\times2^0+1\times2^{-1}+1\times2^{-2}=4+0+1+\frac{1}{2}+\frac{1}{4}=5\frac{3}{4}=5.75

十进制转二进制

因为不知道怎么表示,直接从菜鸟偷了图:

这张图以 0.81250.8125 为例,

img

通过例子还是很容易理解这些转换步骤的。

小数点可以移动,左移表示除以 2,右移表示乘以 2。(101.11)2(101.11)_2 表示数 5345\frac{3}{4},左移一位 (10.111)2(10.111)_2 表示数字 278=12×5342\frac{7}{8}=\frac{1}{2}\times5\frac{3}{4}。同理右移就是乘 2 了。

同十进制小数只能精确表示 10 的幂组成的数一样,二进制小数也只能精确表示由 2 的幂组成的数。同十进制小数一样,如果想要更接近不能精确表示的数,只有通过增加位数来逐渐近似。十进制不能准确的表达像 13\frac{1}{3}57\frac{5}{7} 这些数,只能表示 x×10yx \times{10}^y 这种类型的数。二进制也不能表示准确的表示 15\frac{1}{5} 这种数,只能表示那些能够被写成 x×2yx \times2^y 这种类型的数。

# IEEE 浮点表示

IEEE 浮点标准用 V=(1)s×M×2EV=(-1)^s\times M \times2^E 来表示一个数。

  • (1)s(-1) ^ s 表示符号位,当 s = 0,V 为正数;当 s = 1,V 为负数。

  • M 表示有效数字,大于等于 1,小于 2。

  • 2E2^E 表示指数位。

根据图来理解这个公式(别管里面的数字):

对于 64 位的浮点数,最高的 1 位是符号位 S,接着的 11 位是指数 e(注意注意,这里的阶码字段 e 可以用来计算阶码 E,后面会提到),剩下的 52 位为有效数字 M。

img

对于 32 位的浮点数,最高的 1 位是符号位 s,接着的 8 位是指数 e(跟上面一样),剩下的 23 位为有效数字 M。

·

我们可以从上面知道 M 的值,但是我们还不知道如何计算阶码 E,根据阶码字段 e(exponent)我们可以分成三种不同的情况。

img

** 情况 1 **:规格化的值

e 的位模式不全为 0(数值 0) 或不全为 1(单精度数值为 255,双精度数值为 2047)。阶码的值 E=eBiasE=e-Bias(e 是无符号数),这里的 BiasBias 表示偏置值这个值等于 2k112^{k-1}-1(单精度是 271=1272^{7}-1=127,同理双精度是 1023)。尾数 M=1+fM=1+fff 表示小数值。

情况 2:非规格化的值

e 的位模式全为 0。阶码的值 E=1BiasE=1-Bias,而尾数M=fM=f,表示小数字段的值。

情况 3:特殊值

e 的位模式全为 1,看上面的第三条数据,当小数域全为 0 时,得到的数表示无穷(s=0 时是正无穷)。当小数域为非零时,结果值叫 “NaN”。

通过公式看永远都是抽象的,通过例子理解更好。

我们这里以 1234512345float 的二进制表示举例:

数字 1234512345 二进制为 1100000011100111000000111001

根据规格化数的表示规则,我们将 12345 用以下的方式表示:

12345=1.1000000111001×21312345 = 1.1000000111001\times2^{13} ==> E=13M=1.1000000111001s=0E=13,M=1.1000000111001,s=0

根据 IEEE 浮点数的编码规则,我们需要将小数点左边的 1 丢弃

10000001110011000000111001

这个长度为 13,但是由于单精度的小数字段长度为 23,我们需要在末尾增加 10 个零

\underbrace{1000000111001}_{13}\underbrace{0000000000}_

所以我们这就得到了小数字段 frac,从 12345 的规格化表示可以发现阶码 E 的值为 13。

Biasfloat=127Bias_{float}=127,因为本题符合情况 1,由公式 E=eBiasE=e-Bias,求出 e 的值为 140140140140 二进制为 1000110010001100。根据 IEEE 规定 32 位浮点数符合以下规则:

·

加上符号位 0 我们最终得到:\underbrace{0}\underbrace{10001100}_{exp}\underbrace{10000001110010000000000}_

这就将整数转换成浮点数的二进制了。

# 这东西实在太难了,不写出来估计我看过就忘了。

参考文章:
十进制小数转化为二进制小数 | 菜鸟教程 (runoob.com)
【CSAPP - 深入理解计算机系统】2-4. 浮点数 (下)_哔哩哔哩_bilibili