什么是定点数?

论坛 期权论坛 爱问     
tjnjt   2022-5-23 22:33   8400   8
阅读本文大约需要 3 分钟。
在现实生活中,我们经常使用整数和小数,不知道你有没有思考过,这些数字在计算机中是如何存储的?
我们学习计算机知识时,经常听到「定点数」和「浮点数」,它们之间有什么区别?
平时说到整数,我们就说它是一个定点数,说到小数,就说它是一个浮点数,这种说法是正确的吗?
这篇文章,我们先来看一下,「定点数」究竟与整数和小数有什么关系。
什么是定点数?

要想理解什么是「定点数」,首先,我们需要理解「定点」究竟是什么意思?
我们都知道,数字既包括整数,又包括小数,而小数的精度范围要比整数大得多,所以如果我们想在计算机中,既能表示整数,也能表示小数,关键就在于这个小数点如何表示?
于是人们想出一种方法,即约定计算机中小数点的位置,且这个位置固定不变,小数点前、后的数字,分别用二进制表示,然后组合起来就可以把这个数字在计算机中存储起来,这种表示方式叫做「定点」表示法,用这种方法表示的数字叫做「定点数」。
也就是说「定」是指固定的意思,「点」是指小数点,小数点位置固定即定点数名字的由来。
定点数如何表示数字?

既然定点数只是表示数字的一种方式,那试想,它可以表示整数吗?可以表示小数吗?
答案是肯定的。
定点数如果要表示整数或小数,分为以下三种情况:

  • 纯整数:例如整数100,小数点其实在最后一位,所以忽略不写
  • 纯小数:例如:0.123,小数点固定在最高位
  • 整数+小数:例如1.24、10.34,小数点在指定某个位置
对于前两种情况,纯整数和纯小数,因为小数点固定在最低位和最高位,所以它们用定点数表示时,原理是相同的,只需要把整数部分、小数部分,按照十进制转二进制的规则,分别转换即可。
而对于整数 + 小数的情况,用定点表示时,需要约定小数点的位置,才能在计算机中表示。
定点数表示纯整数和纯小数

听闻不如一见,我们举几个例子。先来看一下定点数如何表示纯整数和纯小数?
对于纯整数100,由于小数点固定在最低位,假定我们以 1 个字节(8 bit)表示,用定点数表示如下(D为十进制缩写,B为二进制缩写):
100(D) = 01100100(B)对于纯小数 0.125,由于小数点固定在最高位,同样以 1 个字节(8 bit)表示,用定点数表示如下:
0.125(D) = 0.00100000(B)从以上例子可以看出,这 2 种情况用定点数表示都比较简单,按照十进制转为二进制规则,即可得到结果。
定点数表示整数+小数

我们再来看定点数如何表示整数 + 小数?
这种情况下,我们需要先约定小数点的位置。
依旧以 1 个字节(8 bit)为例,我们可以约定前 5 位表示整数部分,后 3 位表示小数部分。
对于数字 1.5 用定点数表示就是这样:
1.5(D) = 00001 100(B)数字 25.125 用定点数表示就是这样:
25.125(D) = 11001 001(B)这就是用定点数表示一个小数的方式。这里再总结一下这个过程:

  • 在有限的 bit 宽度下,先约定小数点的位置
  • 整数部分和小数部分,分别转换为二进制表示
  • 两部分二进制组合起来,即是结果
在计算机中,用定点数表示一个数字的方法,是不是很简单?
但是有没有发现一个问题,我们约定了前 5 位表示整数部分,后 3 位表示小数部分,此时这个整数部分的二进制最大值只能是 11111,即十进制的 31,小数部分的二进制最大只能表示 0.111,即十进制的 0.875。
如果我们想要表示更大范围的值,怎么办?

  • 扩大 bit 的宽度:例如使用 2 个字节、4 个字节,这样整数部分和小数部分宽度增加,表示范围也就变大了
  • 改变小数点的位置:小数点向后移动,整个数字范围就会扩大,但是小数部分的精度就会越来越低,没有办法表示类似 0.00001 这种高精度的值
由此我们发现,不管如何约定小数点的位置,都会存在以下问题:

  • 数值的表示范围有限(小数点越靠左,整个数值范围越小)
  • 数值的精度范围有限(小数点越靠右,数值精度越低)
总的来说,就是用定点数表示的小数,不仅数值的范围表示有限,而且其精度也很低。要想解决这 2 个问题,所以人们就提出了使用「浮点数」的方式表示数字,关于浮点数的表示方法,我们会在下一篇文章进行讲解。
虽然定点数表示数字,存在以上说的这些问题,但也只是在表示小数的场景下。如果只是用于表示整数,还是非常方便的。
所以,现代计算机中一般使用定点数来表示整数。
总结

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

  • 定点数是在计算机中表示数字的一种方式,它既可以表示整数,也可以表示小数
  • 在固定 bit 下,约定小数点的位置,然后把整数部分和小数部分分别转换为二进制,就是定点数的结果
  • 受限于小数点的位置,用定点数表示小数时,数值的范围和小数精度是有限的
  • 在现代计算机中,定点数通常用来表示整数,对于高精度的小数,通常用浮点数表示
还想看更多硬核技术文章?快来 关注我 吧!
关注「水滴与银弹」公众号,第一时间获取优质技术干货。7年资深后端研发,用简单的方式把技术讲清楚。
分享到 :
0 人收藏

8 个回复

倒序浏览
2#
vl8g3  1级新秀 | 2022-5-23 22:34:00 发帖IP地址来自 黑龙江大庆
1.5(D) = 00001 100(B),这里没看懂。。。
3#
shiziyan  1级新秀 | 2022-5-23 22:34:51 发帖IP地址来自 北京
1.5的10进制这里为什么是00001 100(B)?1.5转换为二进制是1.1吧? 小数点左边用5位2进制表示是00001没错,但是后面三位为什么是100呢?不是001吗?补零不是在高位补零吗?可以在低位补零?
4#
3o9  1级新秀 | 2022-5-23 22:34:58 发帖IP地址来自 福建莆田
1*2^2/2^3
5#
wfh3m  1级新秀 | 2022-5-23 22:35:16 发帖IP地址来自 中国
100表示0.5是因为,第一位1是2的负一次方,往右以此类推
6#
c4bdi  1级新秀 | 2022-5-23 22:36:08 发帖IP地址来自 CNNIC
整数部分用五个二进制位表示:00001,就是一;小数部分用三个二进制位表示:100,就是五。
7#
a35gd  1级新秀 | 2022-5-23 22:37:03 发帖IP地址来自 云南
可能还要讲下指数随着小数点位置的变化, 我看了一会加上评论指点,才反应过来。
8#
鱼殊  1级新秀 | 2022-5-23 22:37:54 发帖IP地址来自 北京
前五位表示整数噻,后三位是小数。
9#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-5-23 22:38:43 发帖IP地址来自 北京
1.5(D) = 00001 100(B) (最后面3个bit分别表示2的-1,2的-2,2的-3次方;即100=2^-1=0.5)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP