浮点数是我们在编程中常用的一个数据类型,不知道大家想过没有,它为什么叫做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等有趣的东西。

(完)

码农翻身,用故事讲解技术本质, 更多精彩文章,请移步《码农翻身三年文章精华

看完这篇文章,你肯定理解什么是浮点数了!相关推荐

  1. 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!

    原标题:作为运维你还在想要不要学Python,看完这篇文章再说! 本文由马哥教育Python自动化实战班5期学员推荐,转载自简书,作者为Li.Yingjie,内容略经小编改编和加工,观点跟作者无关,最 ...

  2. 看完这篇文章之后,终于明白了编译到底怎么回事。

    看完这篇文章之后,终于明白了编译到底怎么回事. 1 对于同一个语句,有如下三种:高级语言.低级语言.机器语言的表示 C语言  a=b+1; 汇编语言  mov -0xc(%ebp),%eax add ...

  3. 看完这篇文章之后,终于明白了编译到底怎么回事

    看完这篇文章之后,终于明白了编译到底怎么回事. 1 对于同一个语句,有如下三种:高级语言.低级语言.机器语言的表示 C语言  a=b+1; 汇编语言  mov -0xc(%ebp),%eax add ...

  4. 手把手教你完成CSDN对接百度统计 看完这篇文章你还不会对接 欢迎您提刀顺着网线来砍我!!!!

    大家好,我是:じ☆ve朽木,开发经验都是一步一步慢慢积累的,没有谁生来就具有的,只要我们付出了努力,肯定就会有收获!进入我的博客,带你了解Java知识,js小技巧,带你玩转高端物联网.博客地址为:じ☆ ...

  5. [转帖]看完这篇文章你还敢说你懂JVM吗?

    看完这篇文章你还敢说你懂JVM吗? 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用 ...

  6. Dart语言基础,看完这篇文章就够了(二)

    文章内容是我在学习Flutter过程中对知识点的梳理和总结.如有不对的地方,欢迎指出. 本文承接Dart语言基础,看完这篇文章就够了(一),进一步了解Dart语法知识. 文章目录 1 流程控制语句 2 ...

  7. 看完这篇文章知道有什么英语录音翻译成中文的软件

    英语是我们从小到大九年义务必学的科目,但是到了上大学的时候不同专业学习大学英语的时间并不一样,可能是一学期也可能是两个学期,所以很多人都开始通过网课来学习英语或者听外国英语录音,从而帮助我们通过雅思. ...

  8. 艾永亮超级产品:不知道怎么做产品?看完这篇文章了解你的产品

    体验产品,是每个企业家的必经之路,拆解产品就像一次新生,总结产品,是对自身产品的感知,当你不知道该如何做产品时,可以看完这篇文章,也许会得到一些新的启发. 产品体验是每个企业家对自身产品认知和创新的一 ...

  9. 看完这篇文章,你的Python基础就差不多了(附571集精品教程)

    学一门语言贵在坚持用它,不用就淡忘了,而记录下一篇文章也有助于日后快速回忆.全文分为两大部分,分别是Python基础语法和面向对象. 入门Python其实很容易,但是我们要去坚持学习,每一天坚持很困难 ...

  10. 看完这篇文章后,你一定知道如何正确选股!

    看完这篇文章后,你一定知道如何正确选股!篇幅很长,但是都是干货,请耐心阅读! 选股应该博爱!真正的股票投资人一定是拥有博爱情怀的.很多时候,股民们纠结于某只或某几只股票不能自拨,导致频频在股市中吃亏碰 ...

最新文章

  1. 去除Coding4Fun中MessagePrompt的边框(Border)
  2. CODEFORCES 484E Sign on Fence
  3. [WCF编程]13.并发:服务并发模式
  4. python交互式程序设计导论第二周_沧州学堂云Python 交互式程序设计导论搜题公众号...
  5. Spring学习10之动态代理
  6. 循环机换变速箱油教程_问答| 想更换变速箱油,是重力换还是循环换?
  7. mac 使用 pf 做端口转发
  8. 基于Qt的UDP协议实现及解析数据
  9. DM6437 OSD调试记录
  10. 计算机女生考研建议,计算机专业女生考研,建议选取的部分方向
  11. 使用AppleScript批量删除Mac中的信息
  12. 统计|方差分析拒绝原假设的LSD一般步骤及实现
  13. 陶哲轩实分析(上)8.1及习题-Analysis I 8.1
  14. 明基 X3000i 怎么样
  15. 六面体体积求解(规则不规则)
  16. 韩国的计算机sci,JOURNAL OF KOREAN MEDICAL SCIENCE《韩国医学科学杂志》SCI论文投稿_SCI期刊大全_SCI期刊点评_万维书刊网...
  17. [全网最细]接口测试一般怎么测?接口测试的流程和详细步骤
  18. 怎样才能让孩子愿意和家长合作
  19. 3dm显卡测试软件,3DMark新版发布:全球第一个DirectX 12测试工具
  20. 校园跑腿小程序毕业设计毕设作品开题报告答辩PPT

热门文章

  1. ms office excel2013教程 - 数据有效性
  2. 调用其他命名空间中的函数-洋葱先生-杨少通
  3. SQL Server numeric数据类型
  4. mysql cast numeric_(转载)mysql decimal、numeric数据类型
  5. Android灯光系统框架分析
  6. 制图软件cad-深度了解Mechanical 工具组合
  7. visio图片导入word和PPT的最清晰的方式
  8. 可以添加Google adsense广告和阿里妈妈的博客汇总
  9. 支付宝扫码跳转到跳转页面
  10. 鼠标键盘与计算机无法连接,蓝牙鼠标/键盘同时提示已配对 但是永远无法连接上...