计算机数字编码入门篇(下)

发布时间 2023-10-20 18:00:30作者: 小虾_758

前言

本文旨在为初学者提供有关计算机数字编码的基础知识,以帮助他们初步理解计算机中数字编码的概念。鉴于我个人知识的限制,如有不准确之处,欢迎指正并提供建议。

文中部分内容参考ChatGPT,在此感谢ppword的大力支持。

三、计算机如何表示小数

1、定点法

定点数,其关键地方就在“定”和“点”这两个字上面,即在表示小数数据时,把小数点的位置已经约定好固定在某个位置,这是一个约定,二进制数据中并没有小数点的信息。

在定点数中,小数点可以将数据分为整数和小数部分,对于整数部分,我们已经知道怎么转成二进制来表示,但小数部分要怎么转换呢?

1.1、小数部分如何转二进制

我们先来看一个小数:5.375,它的整数部分转成二进制是:101,下面看小数据部分,小数部分用 * 2 计算的方法:

0.375 * 2 = 0.75 (此时整数部分为 0 ,记下0)
0.75 * 2 = 1.50 (此时整数部分为1,小数部0.5, 继续之前的操作)
0.5 * 2 = 1.0 (此时整数部分为1,此时小数部分为 0,结束)
然后把每一步的整数部分从上到下合起来,得到:011

如果遇到一直结束不了(就是不管*2多少次,小数部分一直存在)的时候,那就看你定点数中小数部分定了多少位,多出来的就不要了,当然这会损失一点精度。

我们现在知道0.375转成二进制是:011,那这个又要怎么转回去呢?就是对二进制的每一位做除2的n(位)次的操作,然后相加:

\[0*2^{-1}+1*2^{-2}+1*2^{-3} = 0.375 \]

知道怎么转换后,我们再来看下面的。

1.2、无符号定点数

无符号定点数,数值在机器中字长的全部二进制位中没有符号位,全都是数值位。

在这情况下,我们用8bit来存放5.375,并且约定小数点在中间,在这种情况下,我们可以将前4位用于整数部分,后4位用于小数部分,就得到它的二进制为:01010110

1.3、有符号定点数

有符号定点数,需要专门取一位数据位作为符号位,通常,符号位上的1表示负数,0表示正数,其余位为数值位。

2、浮点法

浮点数是一种数值表示方法,用于在计算机中表示实数(包括小数和整数)以及进行数学运算。浮点数的名称源于其表示方式,即小数点可以"浮动"或"移动",以适应不同的数值范围和精度要求。

我们先来看一组数据,0.666、6.66、66.6、666,他们都有一个共同的特点,就是可以用「科学计数法」来表示成:

\[6.66*10^n,n依次为-1,0,1,2 \]

浮点法和这个有点儿类似,那它究竟是怎么来表示数字的呢?

2.1、IEEE 754 浮点数计数标准

计算机中浮点数表示位如下形式(形式上与科学计数法有些类似)其中M表示尾数,E表示阶码

\[V=(-1)^S*1.M...*2^E \]

  • 符号(S):0表示正数,1表示负数
  • 阶码部分(E):表示小数点移动的位数。E>0表示向右移动,E<0表示向左移动。
  • 尾数部分(M):是浮点数的二进制表示。需要注意的是这里尾数部分,如果不是1.M...这种格式,需要做一个简单处理。

这看着有点迷糊,既然有公式,那我们就按上面的来套一下,就是把我们要转换的值,转成二进制后,再转成公式里的样子,方便起见,还是用5.375来说明。

  • 1.M...:这就是一种格式,如:1.1001、1.00110等,小数点前面的必定是1,因为我们现在是二进制嘛,要是0的话你就把小数点往后移移,总能找到是1的时候
  • 把5.375转成二进制后为:101.011
  • 符号位:这是个正数,结合上面的公式,那可以肯定S=0
  • 阶码(E):对于1.M...的形式,101.011=1.01001*2^2,所以E=127+2,用二进制表示为:10000001

这里为何要加上127呢?等会再看“阶码偏置”

  • 尾数:1.01011的尾数部分就是01011

2.2、阶码偏置

指数偏移值(exponent bias),是指浮点数表示法中的指数域的编码值为指数的实际值加上某个固定的值,IEEE 754标准规定该固定值为:

\[2^{e-1}-1 \]

其中的 为存储指数的比特的长度。

采用指数的实际值加上固定的偏移值的办法表示浮点数的指数,好处是可以用长度为 个比特的无符号整数来表示所有的指数取值,这使得两个浮点数的指数大小的比较更为容易,实际上可以按照字典序比较两个浮点表示的大小。

2.3、用float来表示完整二进制

单精度float一共32位,最高位用来表示符号位,中间的8位用来表示阶码,其它23位用来表示尾数部分:

符号位(S) 阶码部分(E) 尾数部分(M)
1位 8位 23位

按这个定义,5.375表示出来应该是:

符号位(S) 阶码部分(E) 尾数部分(M)
0 10000001 01011000000000000000000

尾数据部分不够23位的,后面补0就是了。

同样的,双精度double一共64位:

符号位(S) 阶码部分(E) 尾数部分(M)
1位 11位 52位

2.4、验证

现在我们已经把5.375转成了二进制形式,就是:01000000101011000000000000000000,我突然想到是不是可以用chatgpt来验证一下结果,于是我就去试了一下,
image
真是忏愧,还是gpt4比较好,说的比我好多了。

3、最后

定点数和浮点数都可以表示小数,而定点数的精度固定,表现范围比较有限;但是,定点数在硬件上比较容易去实现,在实际的数据算法中,定点数运算效率比浮点数的运算效率有大大的提高,同时也降低了数据存储资源。因此,定点数会被广泛的应用到数字信号处理的各种应用场景中。