浮点数谁偷了你的精度.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

如果我告诉你,中关村配置最高的电子计算机的计算精度还不如一个便利店卖的手持计算器你,一定会反驳我:「今天写博客之前又忘记吃药了吧」。

如果我告诉你,中关村配置最高的电子计算机的计算精度还不如一个便利店卖的手持计算器你,一定

会反驳我:「今天写博客之前又忘记吃药了吧」。

你可以用最主流的编程语言计算0.2+0.4,如果你使用的是Chrome、FireFox、IE8+,可以按F12

键,然后找到「控制台」,输入上面的表达式0.2+0.4,回车。

然后再用最简陋的计算器(如果你没有手持计算器没关系,手机、电脑都自带一个计算器,打开“运

行”,输入calc,回车)再计算一下刚才的算式0.2+0.4。

怎么样?同意我的观点了吧!再简陋的计算器也比超级计算器的精度高,关键不在于它的频率和内

存,而在于它是如何设计、如何表示、如何计算的。

不能表示 VS 不能精确表示

不能表示 VS 不能精确表示

在上一章『浮点数(从惊讶到思考)』中我们讲到用浮点数表示数时出现的问题——很多数都不能表示。(注意浮点数表示的是数,而不仅仅是小数。)

如果你数学比较好,或者你确信你身体健康,没有心脏病、高血压,没有受过重大精神创伤,那我告诉你,在浮点数的表示范围内,有多于99.999…%的数在计算机中是不能表示的。真的是太令人吃惊,也太令人遗憾了。真相总是很残忍。

请注意我使用的措辞,区别开不能表示和不能精确表示。

下面我从数量级分析一下,32bit浮点数的表示范围是10的38次方,而表示个数呢,是10的10次方。能够被表示的数只有1/100000000….(大概有30个零),这个数多大呢?还记得那个国际象棋和麦子的故事吗?

为了让你了解指数的威力,我再举个例子:

有一张很大很大的纸,对折38次,会有多高呢?一米?一百米?比珠峰还高?再次考验你心脏承受能力的时刻到了:它不仅仅比珠峰高,其实它已经快到达月球了。

回到原来的话题,还有更残忍的真相。在剩下的可以表示的不到0.000…1%的数中,又有多少不能精确表示呢?这就是我写这篇博客的目的。

上一章中我还给出了一种用定点数精确表示小数的方法。事实上,手持计算器、java中的BigDecimal、C#中的货币类型、MySQL中的NUMERIC类型就是这么干的。你还记得在数据库中添加字段时的SQL语句是如何写的吗?现在明白为什么我说再简陋的计算器也比超级计算器的精度高了吧。

这篇博客我将为大家讲解为什么很多数不能精确表示,本篇可能比较烧脑子,我会尽量用最通俗的语言,最贴近现实的例子来讲解,不在乎篇幅有多长,关键是要给大家讲明白。下一篇,你将了解到浮点数如何工作,以及为什么很多数不能表示。

热身——问:要把小数装入计算机,总共分几步?你猜对了,3步。

??

?

?

?

第一步:转换成二进制

第二步:用二进制科学计算法表示第三步:表示成IEEE754形式

在上面的第一步和第三步都有可能丢失精度

在上面的第一步和第三步都有可能丢失精度。

十进制 VS 二进制

下面我们讨论如何把十进制小数转换成二进制小数(什么?你不会?请自觉去面壁。)

考虑我们将1/7(七分之一)写成小数的时候是如何做的?

用1除以7,得到的商就是小数部分,剩下的余数我们继续除以7,一直除到什么时候结束呢?有两种情况:

如果余数为0。yeah!终于结束了,洗洗睡吧

当除到某一步时,余数等于1…停!stop!等一下,我发现有什么地方怪怪的。余数为1,余数如果为1的话,再继续除下去,不就又是1/7了吗?绕了一个大弯,又回来了?对,你猜的很对,它永远不会结束,它循环了。

注意我上面说的情况2,我们判断他循环,并不是从直观看感觉它重复了,而是因为在计算过程中,它又回到了开头。为什么这么说呢?当你计算一个分数时,它总是连续出现5,出现了好多次,例如0.5555555…你也无法断定它是无限循环的,比如一亿分之五。

记得高中时,从一本数学课外书学到了手动开平方的方法,于是很兴奋的去计算2的平方根,发现它的前几位是1.414,哇,原来「2的平方根」等于1.414141…。很多天以后,当我再次看到我的笔记时,只能苦笑了,「2的平方根」不可能循环啊,它可是一个无理数啊。

你可能不耐烦了,叽哩哇啦说这么多,有用吗?当然有用了,以后如果MM问你:你会爱我到什么时候?你可以回答她:我会爱你到1/7的尽头。难道我会把我的表白方式告诉你们吗?我对你的爱就像圆周率,无限——却永不重复。

扯远了,现在会到主题。你也许会说:我明白了,循环小数不能精确表示,放到计算机中会丢失精度;那么有限小数可以精确表示吧,

文档评论(0)

hao187 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档