看完这篇文章,你肯定理解什么是浮点数了!
浮点数是我们在编程中常用的一个数据类型,不知道大家想过没有,它为什么叫做float呢?
还有,计算机对浮点数的内部表示方法IEEE 874到底是怎么回事?
要彻底理解浮点数,需要从计算机的底层存储开始。
假设有一个32 bit的计算机,需要你来设计一个支持存储“小数”的方案,你会怎么办呢?
定点数
最简单的办法就是把这32位存储分成若干部分, 例如三个部分
(1) 用1位来表达正负位, 0为正, 1为负。
(2) 再划出8位来表示整数部分
(3) 剩下的23位表示小数部分。
就像这样:
上图表示的数值就是182.375,由于小数点固定在了第23位和第24位之间,这种方式可以称为“定点数”。
很明显,由于整数部分的长度比较短,所能表示的数据的范围就比较小。 小数部分比较长, 所能表示的精度就比较高。
我们暂时把这种数据类型叫做fixed number A 。
如果想要表达更大范围的数怎么办? 我们还可以定义一个新的数据类型: fixed number B。 让整数部分扩大一些。
用23位表示整数,这范围比8位大多了, 但是精度又会受到损失了,可见用这种定点数的表示法,范围和精度是一对儿矛盾。
如果再定义fixed number C, fixed number D, 程序员简直就不知道用哪个了, 并且实现他们之间的计算也很麻烦。
所以定点数并不是完美的解决方案。
浮点数
怎么解决定点数的“僵化”问题呢?
我们都知道科学记数法,例如368.79 用科学计数法表示就是 3.6879 * 10 ^2 。
其中3.6879就是尾数,10 是基数, 2 是指数。
浮点数就是利用指数达到了小数点“浮动”的效果。从而可以灵活地表达更大范围内的数, 比如 :
3.6879 * 10 ^ 2 = 368.79
1.2345 * 10 ^ 3 = 1234.5
7.89 * 10 ^ 2 = 789
小数点的位置是不固定的。
不过对于同一个浮点数,也有很多表达方式, 368.79 可以表达为:
3.6879 * 10 ^ 2
0.36879 * 10 ^ 3
36.879 * 10 ^ 1
由于其多样性, 很多计算机厂商都设计了自己的表示浮点数的规则,以及对浮点数运算的细节。 多样的规则对于程序的可靠性和移植性都是不利的。
1976年, 一家叫Intel的公司要设计一个叫做8087的芯片, 这个芯片在8086处理器(这可是大名鼎鼎的芯片啊,计算机系的同学估计很熟悉吧)上增加了支持浮点数的功能。 他们请加州大学伯克利分校的William Kahan教授作为顾问,帮助设计8087芯片。
Intel 还支持Kahan教授加入IEEE资助的制定工业标准的委员会, 最终这个委员会采纳的标准非常接近于Kahan为Intel设计的标准,这就是大名鼎鼎的 IEEE 754 标准。
(码农翻身注:这段描述来自于《深入理解计算机系统》)
该标准在1985年发布,成为了各个计算机厂商都支持的规范,大大提高了程序的可移植性。
最新的标准是2008年发布的 IEEE 754-2008 。
William Kahan教授
IEEE 754
这个标准中有单精度(32位)和双精度(64位), 我们以32位为例来介绍一下,理解了32位,64位就不在话下了。
用科学记数法表示,应该是这样的:
(+ or - ) 1.(mantissa) * 2 ^ exponent
注意:小数点前面是有个1的。
我们接下来用一个例子来计算一下, 把5.8 这个10进制小数转换为IEEE 754表示的浮点数。
首先,5.8 = 1.45 * 2 ^ 2,可能有人问,这是怎么算出来的? 很简单:
5.8/2 => 2.9
2.9/2 => 1.45
接下来就可以把他表示成IEEE 754的形式:
(1) 可以看出 符号位 s = 0
(2) 指数(exponent) 是2 吗?
No! 指数也有正负之分,我们既要能用8位二进制数字表示正数,又要能表示负数。
所以2的8次方这256个数字要区分开来使用: 从0到127 表示负数, 从128到255表示正数。
127 被称为 Bias value (偏置值)
所以exponent = 127 + 2 = 129 , 把129用二进制表示就是10000001。
(注:如果原始的指数是 - 2 , 那exponent 就是 127- 2 = 125)
(3) 尾数mantissa 是0.45 , 需要转化成二进制,怎么做呢? 也很简单,不断地乘2,取结果的整数部分就行,详细过程如下:
可以看出,出现无限循环了,我们取够IEEE 754要求的23位就行了(0.01 1100 1100 1100 1100 1100 1......),可见浮点数是不精确的!
最终,我们把5.8变成了符合IEEE 754 规范的浮点数表示:
很简单的,对吧?
敏锐的同学可能已经看出问题了,这个尾数总是1.mantissa的形式, 那用这种方式怎么才能表示零呢?
这就留作一个小问题让大家去探索吧, 你会发现非规格化,无穷大,NaN等有趣的东西。
(完)
码农翻身,用故事讲解技术本质, 更多精彩文章,请移步《码农翻身三年文章精华》
看完这篇文章,你肯定理解什么是浮点数了!相关推荐
- 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!
原标题:作为运维你还在想要不要学Python,看完这篇文章再说! 本文由马哥教育Python自动化实战班5期学员推荐,转载自简书,作者为Li.Yingjie,内容略经小编改编和加工,观点跟作者无关,最 ...
- 看完这篇文章之后,终于明白了编译到底怎么回事。
看完这篇文章之后,终于明白了编译到底怎么回事. 1 对于同一个语句,有如下三种:高级语言.低级语言.机器语言的表示 C语言 a=b+1; 汇编语言 mov -0xc(%ebp),%eax add ...
- 看完这篇文章之后,终于明白了编译到底怎么回事
看完这篇文章之后,终于明白了编译到底怎么回事. 1 对于同一个语句,有如下三种:高级语言.低级语言.机器语言的表示 C语言 a=b+1; 汇编语言 mov -0xc(%ebp),%eax add ...
- 手把手教你完成CSDN对接百度统计 看完这篇文章你还不会对接 欢迎您提刀顺着网线来砍我!!!!
大家好,我是:じ☆ve朽木,开发经验都是一步一步慢慢积累的,没有谁生来就具有的,只要我们付出了努力,肯定就会有收获!进入我的博客,带你了解Java知识,js小技巧,带你玩转高端物联网.博客地址为:じ☆ ...
- [转帖]看完这篇文章你还敢说你懂JVM吗?
看完这篇文章你还敢说你懂JVM吗? 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用 ...
- Dart语言基础,看完这篇文章就够了(二)
文章内容是我在学习Flutter过程中对知识点的梳理和总结.如有不对的地方,欢迎指出. 本文承接Dart语言基础,看完这篇文章就够了(一),进一步了解Dart语法知识. 文章目录 1 流程控制语句 2 ...
- 看完这篇文章知道有什么英语录音翻译成中文的软件
英语是我们从小到大九年义务必学的科目,但是到了上大学的时候不同专业学习大学英语的时间并不一样,可能是一学期也可能是两个学期,所以很多人都开始通过网课来学习英语或者听外国英语录音,从而帮助我们通过雅思. ...
- 艾永亮超级产品:不知道怎么做产品?看完这篇文章了解你的产品
体验产品,是每个企业家的必经之路,拆解产品就像一次新生,总结产品,是对自身产品的感知,当你不知道该如何做产品时,可以看完这篇文章,也许会得到一些新的启发. 产品体验是每个企业家对自身产品认知和创新的一 ...
- 看完这篇文章,你的Python基础就差不多了(附571集精品教程)
学一门语言贵在坚持用它,不用就淡忘了,而记录下一篇文章也有助于日后快速回忆.全文分为两大部分,分别是Python基础语法和面向对象. 入门Python其实很容易,但是我们要去坚持学习,每一天坚持很困难 ...
- 看完这篇文章后,你一定知道如何正确选股!
看完这篇文章后,你一定知道如何正确选股!篇幅很长,但是都是干货,请耐心阅读! 选股应该博爱!真正的股票投资人一定是拥有博爱情怀的.很多时候,股民们纠结于某只或某几只股票不能自拨,导致频频在股市中吃亏碰 ...
最新文章
- 去除Coding4Fun中MessagePrompt的边框(Border)
- CODEFORCES 484E Sign on Fence
- [WCF编程]13.并发:服务并发模式
- python交互式程序设计导论第二周_沧州学堂云Python 交互式程序设计导论搜题公众号...
- Spring学习10之动态代理
- 循环机换变速箱油教程_问答| 想更换变速箱油,是重力换还是循环换?
- mac 使用 pf 做端口转发
- 基于Qt的UDP协议实现及解析数据
- DM6437 OSD调试记录
- 计算机女生考研建议,计算机专业女生考研,建议选取的部分方向
- 使用AppleScript批量删除Mac中的信息
- 统计|方差分析拒绝原假设的LSD一般步骤及实现
- 陶哲轩实分析(上)8.1及习题-Analysis I 8.1
- 明基 X3000i 怎么样
- 六面体体积求解(规则不规则)
- 韩国的计算机sci,JOURNAL OF KOREAN MEDICAL SCIENCE《韩国医学科学杂志》SCI论文投稿_SCI期刊大全_SCI期刊点评_万维书刊网...
- [全网最细]接口测试一般怎么测?接口测试的流程和详细步骤
- 怎样才能让孩子愿意和家长合作
- 3dm显卡测试软件,3DMark新版发布:全球第一个DirectX 12测试工具
- 校园跑腿小程序毕业设计毕设作品开题报告答辩PPT
热门文章
- ms office excel2013教程 - 数据有效性
- 调用其他命名空间中的函数-洋葱先生-杨少通
- SQL Server numeric数据类型
- mysql cast numeric_(转载)mysql decimal、numeric数据类型
- Android灯光系统框架分析
- 制图软件cad-深度了解Mechanical 工具组合
- visio图片导入word和PPT的最清晰的方式
- 可以添加Google adsense广告和阿里妈妈的博客汇总
- 支付宝扫码跳转到跳转页面
- 鼠标键盘与计算机无法连接,蓝牙鼠标/键盘同时提示已配对 但是永远无法连接上...