二进制小数的表示

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

二进制小数与十进制转换

二进制转十进制

二进制 $(101.11)_2$ 表示数字 $1\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.8125$ 为例,

img

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

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

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

IEEE 浮点表示

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

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

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

  • $2^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=e-Bias$(e 是无符号数),这里的 $Bias$ 表示偏置值这个值等于 $2^{k-1}-1$(单精度是 $2^{7}-1=127$,同理双精度是 1023)。尾数 $M=1+f$,$f$ 表示小数值。

情况 2:非规格化的值

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

情况 3:特殊值

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

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

我们这里以 $12345$ 转 float 的二进制表示举例:

数字 $12345$ 二进制为 $11000000111001$。

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

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

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

$$
1000000111001
$$

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

$$
\underbrace{1000000111001}{13}\underbrace{0000000000}{10}
$$

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

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

·

加上符号位 0 我们最终得到:

$$
\underbrace{0}\underbrace{10001100}{exp}\underbrace{10000001110010000000000}{frac}
$$

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

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


参考文章:
十进制小数转化为二进制小数 | 菜鸟教程 (runoob.com)
【CSAPP-深入理解计算机系统】2-4.浮点数(下)_哔哩哔哩_bilibilititle: 深入了解计算机系统笔记
cover: https://cos.asuka-xun.cc/blog/assets/CSAPP.jpg
date: 2022/12/26
categories:

  • [二进制杂谈]
    tags:
  • 计算机科学
  • CSAPP