定点数和浮点数(一)

在计算机中,只有 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汇编语言--关于 π 的近似计算_汇编语言计算

本文完

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值