您现在的位置是:首页 > 正文

定点数和浮点数(一)

2024-02-01 05:25:22阅读 3

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

本文完

网站文章

  • 深度学习中的batch的大小对学习效果有何影响?

    推荐阅读:[1] 深度学习中的batch的大小对学习效果有何影响? - 言有三的回答 - 知乎[2] 深度学习中的batch的大小对学习效果有何影响? - 程引的回答 - 知乎[3] batch si...

    2024-02-01 05:24:54
  • js 数字加减乘除精度问题,解决小数点后多位小数

    在javascript中,当你使用小数进行加减乘除运算时,你会发现,所得到的结果有时后面带有长长的一段小数,使运算变得复杂,并且影响计算结果。上网查询了一下原因,大致如下:在javascript中,带...

    2024-02-01 05:24:49
  • php+websocket实现在线聊天室(一)

    php+websocket实现在线聊天室(一)

    聊天室最终实现版:https://www.sinight.site/chatroom 可以自己多开几个窗口体验 前言:WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。 浏览器通过 Java...

    2024-02-01 05:24:42
  • Mac上安装Grafana

    Mac上安装Grafana

    Mac上安装Grafana一、背景二、安装步骤1、通过 Home Brew 安装2、通过二进制包进行安装1、下载2、grafana配置文件的路径3、修改grafana配置1、修改默认的3000端口2、...

    2024-02-01 05:24:14
  • Table列表筛选结果保持不变

    Table列表筛选结果保持不变,详解React中setState回调函数

    2024-02-01 05:24:07
  • centos和Ubuntu在线安装docker、docker-compose

    centos和Ubuntu在线安装docker、docker-compose

    然后设置全局Docker容器日志大小,并修改docker的存储目录,在/etc/docker目录创建daemon.json文件,然后写入以下内容,最后重启docker和系统加载文件。然后设置全局Doc...

    2024-02-01 05:24:01
  • Java制作简单的单选和多选测试题

    Java制作简单的单选和多选测试题 题目: 定义考题类(Question)及其子类 完成考题类(Question),单选题(SingleChoice)和多选题(MultiChoice)是其子类 要求:...

    2024-02-01 05:23:31
  • pmm最新版本v2.40.0尝鲜体验

    pmm最新版本v2.40.0尝鲜体验

    让DBA快速初窥pmm v2.40.0

    2024-02-01 05:23:24
  • web安全第九天:服务器端请求伪造漏洞SSRF

    web安全第九天:服务器端请求伪造漏洞SSRF

    web安全第十天:服务器端请求伪造漏洞SSRF

    2024-02-01 05:23:15
  • 初学kafka命令(topics)

    创建kafka topicbin/kafka-topics.sh --create --topic topicname --replication-factor 1 --partitions 1 --zookeeper localhost:2181查询topic,进入kafka目录:bin/kafka-topics.sh --list --zookeeper localhost:2181查...

    2024-02-01 05:23:08