https://blog.csdn.net/weixin_42454243/article/details/125103803

定点数的表示方法

参考文档:
谈谈小数的表示方法之定点数

1. 定义

**定点数(fixed-point number)就是小数点位置固定的数,**也就是说,小数点后面的位数是固定的,比如要记录一笔账目,这些账目的数字都不会超过100,就可以使用2位小数位定点数来记录,比如99.99,2.30,75.28;如果要更精确,可以使用3位小数位的定点数来记录,比如7.668,38.235。

tip:注意对定点数的编码,不需要对小数点位置进行编码,因为小数点位置是固定的(对同一定点数表示方式来说)。

2. 定点数的表示方法

约定计算机中小数点的位置,且这个位置固定不变,小数点前、后的数字,分别用二进制表示,然后组合起来就可以把这个数字在计算机中存储起来,这种表示方式叫做「定点」表示法,用这种方法表示的数字叫做「定点数」。

也就是说「定」是指固定的意思,「点」是指小数点,小数点位置固定即定点数名字的由来。
在这里插入图片描述

定点数如果要表示整数或小数,分为以下三种情况

  1. 纯整数:例如整数100,小数点其实在最后一位,所以忽略不写
  2. 纯小数:例如:0.123,小数点固定在最高位
  3. 整数+小数:例如1.24、10.34,小数点在指定某个位置

对于前两种情况,纯整数和纯小数,因为小数点固定在最低位和最高位,所以它们用定点数表示时,原理是相同的,只需要把整数部分、小数部分,按照十进制转二进制的规则,分别转换即可。

而对于整数 + 小数的情况,用定点表示时,需要约定小数点的位置,才能在计算机中表示。

2.1 定点数表示纯整数

在这里插入图片描述

对于纯整数100,由于小数点固定在最低位,假定我们以 1 个字节(8 bit)表示,用定点数表示如下(D为十进制缩写,B为二进制缩写):

100(D) = 01100100(B)
  • 1

这种情况用定点数表示都比较简单,按照十进制转为二进制规则,即可得到结果。

2.2 定点数表示纯小数

在这里插入图片描述

对于纯小数 0.125,由于小数点固定在最高位,同样以 1 个字节(8 bit)表示,用定点数表示如下:

0.125(D) = 0.00100000(B)
  • 1

这种情况用定点数表示都比较简单,按照十进制转为二进制规则,即可得到结果。

2.3 定点数表示整数+小数

这种情况下,我们需要先约定小数点的位置
依旧以 1 个字节(8 bit)为例,我们可以约定前 5 位表示整数部分,后 3 位表示小数部分。
对于数字 1.5 用定点数表示就是这样:

1.5(D) = 00001 100(B)
  • 1

数字 25.125 用定点数表示就是这样:

25.125(D) = 11001 001(B)
//另外的一种算法,数值乘以小数部分的位数
25.125*2^3=201
201(D) = 1100 1001(B)
//小提示:
0.5(D) = 0.1(B)
0.25(D) = 0.01(B)
0.125(D) = 0. 001(B)

定点数表示一个小数的方式。这里再总结一下这个过程:

  • 在有限的 bit 宽度下,先约定小数点的位置
  • 整数部分和小数部分,分别转换为二进制表示
  • 两部分二进制组合起来,即是结果

2.3.1 无符号定点数

无符号定点数,数值在机器中字长的全部二进制位中没有符号位,全都是数值位。例如,小数1.2转换成16位的定数,小数点的位置约定在第14位和第15位之间。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据计算结果,小数1.2可以用Q14格式的无符号定点数19661表示。

2.3.2 有符号定点数

对于正数来说:

  • 原码 = 反码 = 补码

对于负数来说:

  • 反码 = 符号位不变,原码取反
  • 补码 = 反码 + 1

有符号定点数,需要专门取一位数据位作为符号位,通常,符号位上的1表示负数,0表示正数,其余位为数值位。例如,将小数0.8和-0.8转成Q15格式的定点数。
在这里插入图片描述
求正数0.8的定点数:

在这里插入图片描述
在这里插入图片描述
求负数-0.8的定点数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 如果计算机是32位的话,先规定定点的小数点,假如小数点的位置约定在第25位和第26位之间,3.4*225=114,085,068.8,根据某种舍入模式(比如:四舍五入)舍入后,结果是114,085,069,将10进制转换成二进制,:114,085,069(D)=0110 1100 1100 1100 1100 1100 1101(B),此时就得到了计算机内的32位数值

3. 范围和精度

我们约定了前 5 位表示整数部分,后 3 位表示小数部分,此时这个整数部分的二进制最大值只能是 11111,即十进制的 31,小数部分的二进制最大只能表示 0.111,即十进制的 0.875。

如果我们想要表示更大范围的值,怎么办?

  1. 扩大 bit 的宽度:例如使用 2 个字节、4 个字节,这样整数部分和小数部分宽度增加,表示范围也就变大了
  2. 改变小数点的位置:小数点向后移动,整个数字范围就会扩大,但是小数部分的精度就会越来越低,没有办法表示类似 0.00001 这种高精度的值

由此我们发现,不管如何约定小数点的位置,都会存在以下问题:

  1. 数值的表示范围有限(小数点越靠左,整个数值范围越小)
  2. 数值的精度范围有限(小数点越靠右,数值精度越低)

总的来说,就是用定点数表示的小数,不仅数值的范围表示有限,而且其精度也很低。要想解决这 2 个问题,所以人们就提出了使用「浮点数」的方式表示数字。定点数和浮点数都可以表示小数,而定点数的精度固定,表现范围比较有限;但是,定点数在硬件上比较容易去实现,在实际的数据算法中,定点数运算效率比浮点数的运算效率有大大的提高,同时也降低了数据存储资源。虽然定点数表示数字,存在以上说的这些问题,但也只是在表示小数的场景下。如果只是用于表示整数,还是非常方便的。所以,现代计算机中一般使用定点数来表示整数。

4. 总结

这篇文章我们主要讲了,在计算机中如何使用定点数表示一个数字。总结如下:

  1. 定点数是在计算机中表示数字的一种方式,它既可以表示整数,也可以表示小数
  2. 在固定 bit 下,约定小数点的位置,然后把整数部分和小数部分分别转换为二进制,就是定点数的结果
  3. 受限于小数点的位置,用定点数表示小数时,数值的范围和小数精度是有限的
  4. 在现代计算机中,定点数通常用来表示整数,对于高精度的小数,通常用浮点数表示
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐