java浮点数数转二进制的数吗_深入理解计算机系统(2.7)-二进制小数和IEEE浮点标准 - Java 技术驿站-Java 技术驿站...

整数的表示和运算我们已经讲完了,在实际应用中,整数能够解决我们大部分问题。但是某些需要精确表示的数,比如某件商品的价格,某两地之间的距离等等,我们如果用整数表示将会有很大的出入,这时候浮点数就产生了。

在 20世纪80年代以前,每个计算机厂商都设计了自己表示浮点数的规则,以及对浮点数执行运算的细节,这对于应用程序在不同机器上的移植造成了巨大的困难。而在这之后,也就是 1985年左右,IEEE 标准产生了,这是一个仔细制定的表示浮点数及其运算的标准,现在的计算机浮点数也都是采用这个标准。

浮点数不仅仅是为了让数值的表示更加精确,也是为了表示一些整数无法达到的数字,比如一些接近于0的数字,或者一些非常大的数值。因此浮点数对于计算机的意义是非常大的。

1、二进制小数

前面这篇博客 进制间的转换 我们已经讲过了各个进制数的表示。现在我们复习一下:

进位计数制的要素:

①、数码:用来表示进制数的元素。比如二进制数的数码为:0,1。十进制数的数码为:0,1,2,3,4,5,6,7,8,9。十六进制数的数码为:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

②、基数:数码的个数。比如二进制数的基数为2。十进制数的基数为10。十六进制数的基数为 16.

③、位权:数制中每一固定位置对应的单位值称为位权。例如十进制第2位的位权为101即10,第3位的位权为102即100;而二进制第1位的位权为20即1,第3位的位权为4,对于 N进制数,整数部分第 i位的位权为N(i-1),而小数部分第j位的位权为N-j。

那么我们可以说:每个数码所表示的数值=该数码值 * 所处位置的位权。

0ce512ffb36ba5a9bdea97a8894d613e.png

比如十进制数:(123.45)10=1×102+2×101+3×100+4×10-1+5×10-2

二进制数:(1010)2 =l× 23+0 × 22+l× 21+0 × 20=(10)10

十六进制数:(BAD)16 =11× 162+10×161+13×160=(2989)10

二进制小数(10010.1110)2 = 1 * 24 + 0 * 23 + 0 * 22 + 1 * 21 + 0 * 20 + 1 * 2-1 + 1 * 2-2 + 1 * 2-3 + 0 * 2-4 = 16 + 2 + 1/2 + 1/4 + 1/8

总结来说

十进制表示公式:

a2228e7b07e3ed9eda91246195a9f12a.png

对于一个形式为bm....b0.b-1....b-n的二进制小数b来说,二进制表示公式:

21cb3fe39aef142bf316638cd33dc2b9.png

从上面的二进制公式我们可以看出,小数点向左移动一位,则相当于 (∑ 2i * bi)/2。因为每一位的位权都*2-1;反过来,小数点向右移动一位,则相当于该数乘以2。

注意:二进制小数不像整数一样,只要位数足够,它就可以表示所有整数。假设我们仅考虑有限长度的编码,那么二进制小数无法精确的表示任意小数,比如十进制小数0.2,我们并不能将其准确的表示为一个二进制数,只能增加二进制长度提高表示的精度。

996f19c6864370d21c60e78909e02fd6.png

2、IEEE 浮点表示

IEEE,电气和电子工程师协会( 全称是Institute of Electrical and Electronics Engineers)是一个国际性的电子技术与信息科学工程师的协会,是目前全球最大的非营利性专业技术学会,IEEE 754 标准是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号。

IEEE 浮点标准表示: V = (-1)s * M * 2E。

①、s 是符号位,为0时表示正,为1时表示负。

②、M为尾数,是一个二进制小数,它的范围是0至1-ε,或者1至2-ε(ε的值一般是2-k次方,其中设k > 0)

③、E为阶码,可正可负,作用是给尾数加权。

我们将浮点数的位划分为三个阶段,分别对这些值进行编码。

一、一个单独的符号位 s 直接编码符号 s

二、k 位的阶码字段 exp =ek-1ek-2...e1e0 编码阶码E

三、n 位小数字段 frac = fn-1fn-2...f1f0 编码尾数 M,但是编码出来的值也依赖于阶码字段的值是否等于0.

一般来说,现在的编译器都支持两种浮点格式,一种是单精度,一种是双精度。单双精度分别对应于编程语言当中的float和double类型。其中float是单精度的,采用32位二进制表示,其中1位符号位,8位阶码以及23位尾数。double是双精度的,采用64位二进制表示,其中1位符号位,11位阶码以及52位尾数。如下图表示:

7be4ed89b59c7f6f9bd48eceb7c1ba2f.png

如果给定了位 s 的表示,根据 exp 的值,被编码的值可以分为三种不同的情况(最后一种情况有两个变种)。下图是单精度的情况:

690ba237d6f23c312aa1959cbb6c4212.png

下面我们分别讲解这三种情况(规格化、非规格化、特殊值)

3、规格化

阶码E 的位模式exp既不全为0(数值0),也不全为1(单精度8位1,数值为255,双精度11位,数值为2047)。

这种情况下,阶码字段被解释为以偏置形式表示的有符号整数。”偏置”的含义就是在原有的值的基础上加上一个偏移量,对于阶码位数为k的情况来说,偏移量Bias = 2k-1-1。假设e是阶码的无符号数值,那么真实的阶码E = e - Bias。

单精度阶码位数为8,则Bias = 127。由于8位阶码下的规格化的浮点数的阶码范围是1至254,因此真实阶码的范围则为-126至127。

对于小数字段 frac = fn-1fn-2...f1f0 它的值 0<= f < 1。那么我们可以表示为0. fn-1fn-2...f1f0,也就是二进制小数点在最高有效位的左边。当计算浮点数数值的时候,会在尾数值的基础上加1,也就是真实的尾数M = 1 + f。因此我们可以把 M 看成一个二进制表达式为 1.fn-1fn-2...f1f0的数字。相当于我们省掉了1位二进制,形成了浮点数表示的约定,默认尾数的值还有一个最高位的1。

4、非规格化的值

当阶码域为全 0 的时候,所表示的数就是非规格化形式。

按照上面规格化的阶码求值方式来说,非规格化的阶码值应该固定在-Bias这个值上面。不过这里有一个小技巧,我们设定阶码的值E = 1 - Bias。这样做是为了能够平滑的从非规格化的浮点数过渡到规格化的浮点数,有关这一点后面我们再详细看。

对于尾数的解释,非规格化的方式与规格化不同,它不会对尾数进行加1的处理,也就是说,真实的尾数M = f。这是为了能够表示0这个数值,否则的话尾数总是大于1,那么无论如何都将得不到0这个数值。

非规格化的浮点数除了可以表示0以外,它还有一个作用,就是可以表示接近于0的数值。另外,在浮点数当中,0的表示有两种,一种是位表示全部为0,则为+0.0。还有一种则是符号位为1,其余全为0,此时为-0.0。

5、特殊值

特殊值是指阶码全为 1 的时候出现的。

在阶码全为1时,如果尾数位全为0,则表示无穷大。符号位为0则表示正无穷大,相反则表示负无穷大。倘若尾数位不全为0时,此时则表示NaN,表示不是一个数字。一些运算的结果不能是实数或者无穷,就会返回NaN值,比如正无穷减正无穷,-1的根号值。在某些应用中表示未初始化的值,也很有用处。这一点在Javascript当中有一个函数isNaN()与这个NaN的含义有点类似,它的作用是用来判断一个参数或者表达式是否是一个数字。

6、数值范围

注意:由于浮点数在正负的区间内是一一对应的,因此我们将忽略符号位对取值范围的影响,我们只讨论符号位为0的情况。

非规格化

①、最小的正非规格化值的位表示,是由最低有效位为 1 而其他所有位为 0 构成。它具有小数(尾数)值 M=f=2-n 和阶码值 E= -2k-1 +2。因此它的数字值是 V= 2-n * 22 - 2k-1 = 2-n+2 - 2k-1。

②、最大的非规格化值,全为0的阶码字段和全为1的小数字段组成。此时的小数(尾数)值 M=f=1-2-n,阶码 E= -2k-1 +2,因此此时的值为 (1 - 2-n) * 22 - 2k-1。

规格化

①、最小的正规格化值,阶码字段的最低有效位为1,其它位为0,。它的尾数值 M = 1。阶码值 E= -2k-1 +2。因此数值 V = 22 - 2k-1

②、最大的规格化值,符号位为0,阶码最低有效位等于0,其它位等于 1,尾数为n个1。它的小数值 f=1-2-n,尾数 M= 2 - 2-n,此时的值为(2 - 2-n) * 2-1 + 2k-1,也可以化简一下为(1 - 2-n-1) * 22k-1。

下面我们看一下非负浮点数单双精度取值范围:

a8233571276ec828a3891be51c54184b.png

7、总结

本篇博客介绍的 IEEE 浮点标准算是难度系数很高的一节了,需要花很多时间去理解。下篇博客浮点数据类型的舍入以及运算。

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

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

相关文章

Docker 终失 C 位,开源少年缘何黑化

作者 | 马超出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;开源真是火了&#xff0c;近些年成功的IT项目像TensorFlow、RocketMQ、TDEngine都是开源项目&#xff0c;而且这种火爆还出了圈&#xff0c;连带着RISC-V这种准开源的芯片也成为了各方争抢的香饽饽。但是…

中油即时通信电脑版_市场营销之即时通讯营销

✎IM营销又叫即时通讯营销(instantmessaging)&#xff0c;是企业通过即时工具im推广产品和品牌,以实现目标客户挖掘和转化的网络营销方式。封面设计丨Sweety 责编丨花花第60篇丨每日一篇好文&#xff1a;2645字丨5分钟阅读即时通讯营销常用的主要有以下两种情况&#xff1a;第一…

java组合框的事件有哪些_博为峰Java技术文章 ——JavaSE Swing列表框选取事件的处理...

博为峰小博老师&#xff1a;在JList类中有addListSelectionListener()方法&#xff0c;可以检测用户是否对JList的选取有任何的改变。在ListSelectionListener接口中只定义一个方法&#xff0c;那就是valueChanged(ListSelectionEvente)&#xff0c;所以必须实现这个方法&#…

使用 Arthas 排查 SpringBoot 诡异耗时的 Bug

简介&#xff1a; 公司有个渠道系统&#xff0c;专门对接三方渠道使用&#xff0c;没有什么业务逻辑&#xff0c;主要是转换报文和参数校验之类的工作&#xff0c;起着一个承上启下的作用。最近&#xff0c;在优化接口的响应时间&#xff0c;优化了代码之后&#xff0c;但是时间…

关于数据库,你可能最想知道的几件事

【CSDN 编者按】随着技术不断更新&#xff0c;数据库的发展可谓全面开花&#xff0c;也吸引了越来越多人的关注&#xff0c;但大家真的都足够了解数据库吗&#xff1f;作者 | 易璜珵 责编 | 侯淼淼出品 | 《新程序员》互联网飞速发展的时代里&#xff0c;数据库、中间件和…

java反编译工具_JDA Java反编译工具的下载和使用手册

JDA(javadecompile analysis)是一款以dex为核心的java反编译工具&#xff0c;同时支持apk、dex、jar文件的反编译&#xff0c;支持动态重命名。该软件主要是用来反编译分析代码而不是反编译出来完全正确的java代码&#xff0c;运行需安装jdk1.8及以上版本版本(jdk1.7应该也行)。…

OpenKruise v0.8.0 核心能力解读:管理 Sidecar 容器的利器

简介&#xff1a; OpenKruise 是阿里云开源的云原生应用自动化管理套件&#xff0c;也是当前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 项目。它来自阿里巴巴多年来容器化、云原生的技术沉淀&#xff0c;是阿里内部生产环境大规模应用的基于 Kubernetes 之…

请把ios文件解压出来是什么意思_【张小亮】最新版本行会3。中文版本。解压即玩。...

电脑游戏目录【回复&#xff1a;电脑游戏】手机游戏目录【回复&#xff1a;手机游戏】【张小亮】最新版本行会3。中文版本。解压即玩。【名称】行会3【大小】4.12 GB【版本】v0.9.9【系统】电脑游戏【下载】本文中【往下滑】【安装】1。请下载【好压】这款解压软件进行解压。2。…

数据结构是如何装入 CPU 寄存器的?

作者|码农的荒岛求生来源|码农的荒岛求生有同学问了这样一个问题&#xff1a;既然CPU内部的寄存器数量有限&#xff0c;容量有限&#xff0c;那么我们使用的庞大的数据结构是怎样装入寄存器供CPU计算的呢&#xff1f;这篇文章就为你讲解一下这个问题。内存与数据真正有用的程序…

基于WASM的无侵入式全链路A/B Test实践

简介&#xff1a; 我们都知道&#xff0c;服务网格(ServiceMesh)可以为运行其上的微服务提供无侵入式的流量治理能力。通过配置VirtualService和DestinationRule&#xff0c;即可实现流量管理、超时重试、流量复制、限流、熔断等功能&#xff0c;而无需修改微服务代码。 本文所…

网易游戏基于 Flink 的流式 ETL 建设

简介&#xff1a; 网易游戏流式 ETL 建设实践及调优经验分享&#xff5e; 网易游戏资深开发工程师林小铂为大家带来网易游戏基于 Flink 的流式 ETL 建设的介绍。内容包括&#xff1a; 专用 ETLEntryX 通用 ETL调优实践未来规划 一. 业务背景 网易游戏 ETL 服务概况 网易游戏的…

potplayer 多个进程_创建守护进程的步骤

什么是守护进程&#xff1f;答&#xff1a;守护进程是后台运行的、系统启动是就存在的、不予任何终端关联的&#xff0c;用于处理一些系统级别任务的特殊进程。实现思路&#xff1a;实现一个守护进程&#xff0c;其实就是将普通进程按照上述特性改造为守护进程的过程。需要注意…

mysql 走索引 很慢_MySQL优化:为什么SQL走索引还那么慢?

背景2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了。硬件配置&#xff1a;256G 内存&#xff0c;48 core分析过程接手这个问题时现场已经不在了&#xff0c;信息有限&#xff0c;所以我们先从监控系统中查看一下当时的状态。从 PMM 监控来看&#xff0c;这个 MySQL 实…

华为徐直军:以持续创新加快数字化发展

【中国 深圳】2021年9月23日&#xff0c;华为全联接大会以线上形式举行&#xff0c;今年的全联接大会以“深耕数字化”为主题&#xff0c;汇聚了业界思想领袖&#xff0c;商业精英&#xff0c;技术大咖&#xff0c;生态伙伴等&#xff0c;探讨如何深入业务场景&#xff0c;把数…

大型 Web 应用插件化架构探索

简介&#xff1a; 随着 Web 技术的逐渐成熟&#xff0c;越来越多的应用架构趋向于复杂&#xff0c;例如阿里云等巨型控制台项目&#xff0c;每个产品下都有各自的团队来负责维护和迭代。不论是维护还是发布以及管控成本都随着业务体量的增长而逐渐不可控。在这个背景下微前端应…

高精地图技术专栏 | 基于空间连续性的异常3D点云修复技术

简介&#xff1a; 我们需要通过激光的内部机制和数据处理算法&#xff0c;将这些噪声恢复到它本来的位置。本文会从MTA问题产生的原理、激光应对MTA的内部机制、数据处理算法三方面来介绍高精资料处理是如何解决这个问题的。 1.背景 1.1 高精资料采集 高精采集车是集成了测绘…

pytorch 图像分割的交并比_「通知」《深度学习之图像识别》再版工作启动,欢迎指导和提建议...

不知不觉有三第一本书也上市超过1年半了&#xff0c;第一次写作略显稚嫩&#xff0c;许多细节处理不当&#xff0c;比如没有在印刷前核对公式&#xff0c;被删掉了参考文献影响读者阅读体验等。现在本书正式启动再版工作&#xff0c;注意不是重印&#xff0c;是再版。重印只是修…

mysql实例怎么复制_Mysql实例MySQL数据库复制概论

《Mysql实例MySQL数据库复制概论》要点&#xff1a;本文介绍了Mysql实例MySQL数据库复制概论&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。导读&#xff1a;每当我们讨论一项(新的)领域技术的时候,最好的方式通常是首先抛出一些问题,这些问题大致分为三类&a…

app inventor离线版_百度要哭了!今日头条出了搜索引擎了,还做了APP

今天小编为大家送上几条新闻了&#xff1a;1 微软给Edge浏览器添加离线小游戏谷歌浏览器在不联网的情况下&#xff0c;会有一个小恐龙跳一跳的游戏&#xff0c;而最近换上chromium内核的edge&#xff0c;也添加了自己的离线小游戏。这是一款冲浪游戏&#xff0c;非常类似于微软…

打车业务下单高并发解决方案

简介&#xff1a; 打车业务下单高并发解决方案前言 在技术领域有一条准则&#xff0c;即不存在银弹技术。在实际工作中&#xff0c;通常无法通过几项简单的技术组合就解决实际业务中各种场景下的复杂问题。虽然追求架构的简单简洁也是架构师的目标之一。但必须认识到架构的简单…