在计算机中,只有 0 1 这样的代码,根本就无法表示小数点。
那么,小数,应该怎么表示呢?
实际上,可以假设,有一个小数点,隐含在二进制数之中,不显示。
那么,一个字节中,小数点在何处? 如何表示?
为了解决这个问题,在《计算机组成原理》中,就定义了所谓的:“定点数” 和 “浮点数”。
其实,这两个名称,还是值得推敲的。
所谓的 “定点数”
在 “定点数” 中,又分成 “定点整数” 和 “定点小数”。
它们的小数点位置,分别隐含在【数值位的最后】和【符号位与数值位之间】。
如此一来,它们也就只能代表【整数】和【纯小数】了。
整数,当然包括:正整数、零、负整数。
小数,除了正负数之外,还应该有纯小数和带小数的区别。
带小数,是既有整数部分,又有小数部分的数值。
如果把小数点放在数据之中,就可以表示带小数了。
那么,这种数据表示方法,就是并不明确指定小数点位置。
小数点到底隐含在何处? 要由编程人自己去猜。
小数点不一定就是在数值位前面或后面,可以由编程人任意指定。
小数点位置不明确,由编程人来指定,这种数据,是 “定点数” 吗?
应该称为【浮点数】才合理。
所谓的 “浮点数”
在计算机专家所说 “浮点数” 中,小数点的位置,是用 “阶码” 明确给出的。
看到这一组二进制数,就知道小数点在何处,不用自己费心来确定 “隐含的位置”。
这样的一组二进制数,就应该称为:【定点数】。
给这两种数据命名的计算机专家,汉语四级,好像没有过吧?
带小数,到底是怎么表示呢?
用所谓的 “浮点数” 来表示,确实是可以的。
但是,在很多场合中,也不需要费那么多事。
只要把小数点安排在数值位中间,就行了。
一个字节的二进制数,如:1101 0011,当小数点处于不同位置时,
它所代表的数值,如下表所示。
其中第一行和倒数第二行,就是计算机专家所说的 “定点整数” 和 “定点小数”。
看看其它几行,它们所能表示的数值,花样就多一些了。
带小数的应用
先说一个简单的例子。
有哥几个,去吃西瓜。挑了几个之后,每个西瓜都切八瓣,开吃!
吃饱之后,算账吧,总共吃了几个西瓜?
大家报一报。
甲:吃了五块,是 0000 0101;
乙:吃了三块,是 0000 0011;
丙:吃了四块,是 0000 0100;
。。。
他们每人说的,都是:块数。
如果加上小数点,就是西瓜的个数。
甲:吃了五块,是 0000 0.101 个;
乙:吃了三块,是 0000 0.011 个;
丙:吃了四块,是 0000 0.100 个;
。。。
把块数加在一起,再除以 8,就是总的个数。
(当然,如果余数不为零,个数,就应该再加上一个。)
再看另外一个例子。
有一种温度传感器,叫做 DS18B20。
它测得温度之后,将以 16 位二进制补码(bit15 ~ bit0)给出测量结果。
其中高 12 位是整数、低 4 位是小数。
这就是说,小数点的位置,是隐含在 bit4 和 bit3 之间的。
那么,这种传感器的分辨率就是:1/16 ℃。即其最低位 (LSB) 就代表 1/16 ℃。
DS18B20 的一些测量数据与温度对应关系如下表所示。
如果数据的最高位是 0,它们就代表正温度数值,也就是温度的绝对值。
如果数据的最高位是 1,将全部位取反加一,也就得到了温度的绝对值。
将绝对值除以 16,其商就是整数、余数就是小数。
小数部分,是四位二进制数。它们所对应的十进制数,如下所示。
把四位二进制转换成十进制的方法是:
先把二进制乘以 10,再除以 16,商,即为一位十进制数。
如果余数不为零,就再重复上述操作,直到达到精度要求。
如 1111 --> 9375:
1111 * 1010 = 1001 0110,/ 16 = 9 ... 6
0110 * 1010 = 0011 1100,/ 16 = 3 ... 12
1100 * 1010 = 0111 1000,/ 16 = 7 ... 8
1000 * 1010 = 0101 0000,/ 16 = 5 ... 0
还有一个例子,给定半径 r,求周长 L。
公式大家都会:L = 2 π r。
式中的 π,是无限不循环小数!
要认真算起来,就应该用所谓的 “浮点数” 了。
但是,π 有近似的公式:约率 22 / 7、密率 355 / 113。
采用这些整数进行计算,就可以避免非常复杂的浮点数算法。
使用密率来计算,精度还是相当高的,不次于使用浮点数。
r * 2;
* 355;
/ 133。
剩下的,就是显示结果了。
具体程序可见:80x86汇编语言--关于 π 的近似计算_汇编语言计算
本文完