计算机如何存储浮点数和定点数?

news2024/11/27 9:54:27

1 浮点数的不精确性

能不能用二进制表示所有实数,然后在二进制下计算它的加减乘除呢?

打开Chrome Console,输入0.3 + 0.6:

简单加法在js算出结果居然不是准确的0.9,而是0.8999999999999999,why?

计算机通常用16/32比特(bit)表示一个数。32比特能表示所有实数吗?显然不。32个比特,只能表示2^32=40亿。超过这数,就会有两个不同的数的二进制表示相同 。计算机就不知道这个数到底是啥。

40亿个数看起来很多,但比起无限多的实数集合也就渺小。到底应该让这40亿个数映射到实数集合上的哪些数,在实际应用中才最划得来?

2 定点数

直观的,4比特表示0~9整数,则32比特即可表示8个这样的整数:

  • 然后把最右边的2个0~9的整数,当成小数部分
  • 左边6个0~9的整数,当成整数部分

就可用32比特表示从0~999999.99这样1亿个实数。

这种二进制表示十进制的编码方式,叫BCD编码(Binary-Coded Decimal)。最常用的是在超市、银行这样需要用小数记录金额的情况里。超市小数最多到分。这样的表示方式,直观清楚,满足小数部分计算。

3 缺点

  • 浪费
    本来32比特可表示40亿个不同数,但BCD编码只能表示1亿个数,要精确到分,那么能够表示的最大金额也就是到100万。
    货币单位是人民币或者美元还好,津巴布韦币数量就不够。
  • 无法同时表示很大数和很小数
    有时想表示商品金额,关心9.99这样小数字;有时候,物理学运算,需要表示光速,即 3 × 1 0 8 3×10^8 3×108 这样大数。
    是否既能够表示很小的数,又能表示很大数?

4 浮点数(Floating Point)

即float类型。在一张便签纸上,用一行来写一个十进制数,能够写下多大范围的数?
要让人能够看清楚,所以字最小也有一个限制:纸张宽度限制了能表示的数大小。如宽度只放下8个数,还是只能写下最大到99999999这样的数字。

这纸张宽度和32比特一样,在空间层限制。现实怎么表示大数?如宇宙内原子数量,莫非是用一页纸,用好多行写下很多0?不,我们用科学计数法,如 1.0×10^82,而非写82个0。
计算机也可采用类似办法,用科学计数法表示实数。浮点数科学计数法有个IEEE标准,定义两个基本格式:

  • 32比特表示单精度浮点数,即float或float32类型
  • 64比特表示双精度浮点数,即double或float64类型

    单精度的32比特可分成三部分。
  • 第一部分,一个符号位,表示正数or负数。s表示。浮点数不像正数,分符号数还是无符号数,所有浮点数都是有符号。
  • 8比特组成指数位。e表示。8比特能表示的整数空间:0~255。这里用1~254映射到-126~127这254个有正有负的数上。
    浮点数,不仅想要表示大数,还希望能够表示很小的数,所以指数位也有负数。
    没有用到0和255。没错,这里的 0(也就是8个比特全部为0) 和 255 (也就是8个比特全部为1)另有它用。
  • 23比特组成的有效数位。用f来表示

科学计数法的浮点数表示:
( − 1 ) s × 1. f × 2 e (-1)^s×1.f×2^e (1)s×1.f×2e

这里的浮点数,无法表示0。要表示0和一些特殊数,就要用上在e里留下的0和255,这两个其实是标记位。
e=0 f=0时,就把这个浮点数认为是0:
如0.5的符号s应该是0,f应该是0,而e应该是-1,也就是

0.5 = ( − 1 ) 0 × 1.0 × 2 − 1 = 0.5 0.5= (-1)^0×1.0×2^{-1}=0.5 0.5=(1)0×1.0×21=0.5,对应的浮点数表示,就是32个比特。

s = 0 , e = 2 − 1 s=0,e = 2^{-1} s=0e=21,需要注意,e表示从-126到127个,-1是其中的第126个数,这里的e如果用整数表示,就是 2 6 + 2 5 + 2 4 + 2 3 + 2 2 + 2 1 = 126 2^6+2^5+2^4+2^3+2^2+2^1=126 26+25+24+23+22+21=126 1. f = 1.0 1.f=1.0 1.f=1.0

这样的浮点数表示下,不考虑符号,浮点数能表示的最小数和最大数:
1.17 × 1 0 − 38 1.17×10^{-38} 1.17×1038
3.40 × 1 0 38 3.40×10^{38} 3.40×1038

比前面的BCD编码能够表示的范围大多了。

5 总结

这样的表示方式下,浮点数能够表示的数据范围一下子大了很多。
因为这个数对应的小数点的位置“浮动”,才被称为浮点数。随指数位e值不同,小数点位置也在动。
对应的,前面的BCD编码的实数,就是小数点固定在某一位的方式,我们也就把它称为定点数。

为什么0.3 + 0.6不能得到0.9?
因为,浮点数没有办法精确表示0.3、0.6和0.9。0.1~0.9这9个数,只有0.5能够被精确地表示成二进制的浮点数:s = 0、e = -1、f = 0。

而0.3、0.6、0.9,都只是近似表达。浮点数无论是表示还是计算其实都是近似计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

火山语音丨AI创作惊艳四方 诸多挑战仍在路上

2022年8月,一幅名为《太空歌剧院》的数字画作获得冠军同时引发了巨大争议,AIGC(AI产生内容:AI-Generated Content)出圈的事件便频频出现在大众视野。同年11月30日OpenAI发布的聊天机器人模型ChatGPT免费开放&#xff0…

从0到1完成一个Vue后台管理项目(二十、地图涟漪、线图)

往期 从0到1完成一个Vue后台管理项目(一、创建项目) 从0到1完成一个Vue后台管理项目(二、使用element-ui) 从0到1完成一个Vue后台管理项目(三、使用SCSS/LESS,安装图标库) 从0到1完成一个Vu…

缓存穿透、布隆过滤器、布谷鸟过滤器

1.概述 缓存穿透: 当查询的数据在缓存(redis)中没有时,一般业务上就会去查询数据存储(数据库),这种情况称为缓存穿透。穿透的数量太大会造成数据存储撑不住(数据库)而宕…

基于控制器软件需求事项进行单元测试和单元测试规范

基于需求事项的单元测试是什么? ​ 大多数汽车行业都遵循 ISO 26262 中定义的标准,这是 ISO 制定的汽车功能安全国际标准。 根据 ISO 26262 标准软件单元测试 (ISO 26262-6-9),单元验证是验证要验证的单元(功能或功能&#xff09…

智能优化算法应用:基于蜣螂优化算法的工程优化案例

智能优化算法应用:基于蜣螂算法的工程优化案例 文章目录智能优化算法应用:基于蜣螂算法的工程优化案例1.蜣螂算法2.压力容器设计问题3.三杆桁架设计问题4.拉压弹簧设计问题5.Matlab代码6.Python代码摘要:本文介绍利用蜣螂搜索算法&#xff0c…

MyBatis框架知识点总结

一、引言1.1 什么是框架?框架:框架使用你的,而不是你在使用框架的。框架让我们提供什么信息,配置信息,数据库连接用户名密码等,你必须提供,还得按照框架要要求的方式提供,否则你就别…

《图机器学习》-Node Embeddings

Node Embeddings一、Graph Representation Learning二、Node Embeddings:Encoder and Decoder三、Random Walk Approaches for Node Embeddings一、Graph Representation Learning 在传统的图机器学习中,依赖于手工特征工程(即由特征工程师去设计节点、…

每日一题:Leetcode54. 螺旋矩阵

文章目录 系列:数组专练 语言:java & go 题目来源:Leetcode54. 螺旋矩阵 难度:中等 考点:边界问题处理 思路和参考答案文章目录题目描述思路java参考代码go参考代码:题目描述 给你一个 m 行 n 列的矩…

力扣sql基础篇(三)

力扣sql基础篇(三) 1 查询结果的质量和占比 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 把该列置为null的话,它就不会统计了 SELECT query_name,ROUND(sum(rating/position)/count(*),2) quality, ROUND(count(IF(rating<3,rating,null))/c…

【数据结构】—— Java实现双向链表

Java实现双向链表一、链表的概念及结构二、头指针与头结点的异同三、代码实现一、链表的概念及结构 我们在单链表中&#xff0c;有了next指针。这就使得我们查找下一个结点的时间复杂度为O(1)。可是我们要查找的是上一个结点的话&#xff0c;那最坏的时间复杂度就是O(n)了&…

用图记忆C语言中的运算符优先级

运算符优先级以及结合方向的统计表&#xff0c;网上到处可见。本文画了一张图&#xff0c;以便记忆&#xff01; 1. 总体来说优先级 初级运算 > 单目运算 > 双目运算 > 三目运算 > 赋值运算 > 逗号运算 2. 双目细分 算术运算 > 位移运算 > 关系运算 &g…

今年十八,基础过关

目录 前言 第一关&#xff1a;KEY在哪里 再加密一次你就得到key啦~ 猜猜这是经过了多少次加密&#xff1f; 据说MD5加密很安全&#xff0c;真的是么&#xff1f; 种族歧视 HAHA浏览器 key究竟在哪里呢&#xff1f; key又找不到了 冒充登陆用户​编辑 比较数字大小 就不让你…

Linux应用编程---14.UDP服务器、客户端编程

Linux应用编程—14.UDP服务器、客户端编程 ​ 之前有介绍过UDP是一种无连接、尽最大努力交付、面向报文的协议。应用层交给UDP多长的报文&#xff0c;UDP就照样发送。Linux下UDP属于数据报socket。数据报socket流程图如图1所示&#xff1a; 图1 数据报socket流程图 ​ 新引入的…

FourIE:一种最新联合事件抽取SOTA论文解读

Cross-Task Instance Representation Interactions and Label Dependencies for Joint Information Extraction with Graph Convolutional Networks 论文&#xff1a;Cross-Task Instance Representation Interactions and Label Dependencies for Joint Information Extractio…

Vue2的前端路由(vue-router)

一、路由 路由 (英文&#xff1a;router)就是页面地址与组件之间的对应关系 二、路由方式 服务器端路由、前端路由 三、前端路由 前端路由&#xff1a;地址和组件之间的对应关系&#xff0c;即由前端来维护一组路由规则&#xff08;地址和组件之间的对应关系&#xff09;&…

xlsx.utils.sheet_to_json的{ header: 1 }起的作用,header属性的研究

XLSX.utils.sheet_to_json 是为了把excel里面的数据解析出来&#xff0c;这是它的定义&#xff1a; 其中&#xff0c;worksheet表示特定表名的工作表&#xff0c;opts属于可要可不要的参数。 opts也有几种类型&#xff1a; export interface Sheet2JSONOpts extends DateNFOp…

selinux 控制

在某些Linux发行版上&#xff0c;默认情况下启用SELinux&#xff0c;如果不了解SELinux的工作原理以及如何配置它的基本详细信息&#xff0c;则可能会导致一些不必要的问题。一般强烈建议了解了SELinux 之后再去实现它。但是&#xff0c;在了解 SELinux 的实现细节之前&#xf…

由浅入深,详解ViewModel的那些事

Hi&#xff0c;你好 &#x1f603; 引言 关于 ViewModel &#xff0c;Android 开发的小伙伴应该都非常熟悉&#xff0c;无论是新项目还是老项目&#xff0c;基本都会使用到。而 ViewModel 作为 JetPack 核心组件&#xff0c;其本身也更是承担着不可或缺的作用。 因此&#x…

STL list 模拟实现

list 概述 相比于 vector 的连续线性空间&#xff0c;list 采用的是零散的空间&#xff0c;它的好处是每次插入或删除一个元素&#xff0c;就配置或释放一个元素空间。 list 是支持常数时间从容器任何位置插入和移除元素容器&#xff0c;但不支持快速随机访问。list 通常实现…

Linux操作系统之进程间通讯—共享内存与消息队列

文章目录一、共享内存1、共享内存的原理2、共享内存的实现三、消息队列1、消息队列原理2、消息队列实现一、共享内存 1、共享内存的原理 共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物理内存上申请一块空间&#xff0c;多个进程可以将其映射到…