代码之谜-谁偷了你的精度

代码之谜-谁偷了你的精度

ID:15437484

大小:53.00 KB

页数:4页

时间:2018-08-03

代码之谜-谁偷了你的精度_第1页
代码之谜-谁偷了你的精度_第2页
代码之谜-谁偷了你的精度_第3页
代码之谜-谁偷了你的精度_第4页
资源描述:

《代码之谜-谁偷了你的精度》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、如果我告诉你,中关村配置最高的电子计算机的计算精度还不如一个便利店卖的手持计算器,你一定会反驳我:又忘记吃药了吧你可以用最主流的编程语言计算0.2+0.4,如果你使用的是Chrome、FireFox、IE8+,可以按F12键,然后找到「控制台」,输入上面的表达式0.2+0.4,回车。然后再用最简陋的计算器(如果你没有手持计算器没关系,手机、电脑都自带一个计算器,打开“运行”,输入calc,回车)再计算一下刚才的算式0.2+0.4。怎么样?同意我的观点了吧!再简陋的计算器也比超级计算器的精度高,关键不在于

2、它的频率和内存,而在于它是如何设计、如何表示、如何计算的。不能表示VS不能精确表示在上一章『浮点数(从惊讶到思考)』中我们讲到用浮点数表示数时出现的问题——很多数都不能表示。(注意浮点数表示的是数,而不仅仅是小数。)如果你数学比较好,或者你确信你身体健康,没有心脏病、高血压,没有受过重大精神创伤,那我告诉你,在浮点数的表示范围内,有多于99.999…%的数在计算机中是不能表示的。真的是太令人吃惊,也太令人遗憾了。真相总是很残忍。请注意我使用的措辞,区别开不能表示和不能精确表示。下面我从数量级分析一下,3

3、2bit浮点数的表示范围是10的38次方,而表示个数呢,是10的10次方。能够被表示的数只有1/100000000….(大概有30个零),这个数多大呢?还记得那个国际象棋和麦子的故事吗?为了让你了解指数的威力,我再举个例子:有一张很大很大的纸,对折38次,会有多高呢?一米?一百米?比珠峰还高?再次考验你心脏承受能力的时刻到了:它不仅仅比珠峰高,其实它已经快到达月球了。回到原来的话题,还有更残忍的真相。在剩下的可以表示的不到0.000…1%的数中,又有多少不能精确表示呢?这就是我写这篇博客的目的。上一章中

4、我还给出了一种用定点数精确表示小数的方法。事实上,手持计算器、java中的BigDecimal、C#中的货币类型、MySQL中的NUMERIC类型就是这么干的。你还记得在数据库中添加字段时的SQL语句是如何写的吗?现在明白为什么我说再简陋的计算器也比超级计算器的精度高了吧。这篇博客我将为大家讲解为什么很多数不能精确表示,本篇可能比较烧脑子,我会尽量用最通俗的语言,最贴近现实的例子来讲解,不在乎篇幅有多长,关键是要给大家讲明白。下一篇,你将了解到浮点数如何工作,以及为什么很多数不能表示。热身——问:要把小

5、数装入计算机,总共分几步?你猜对了,3步。·第一步:转换成二进制·第二步:用二进制科学计算法表示·第三步:表示成IEEE754形式在上面的第一步和第三步都有可能丢失精度。十进制VS二进制下面我们讨论如何把十进制小数转换成二进制小数(什么?你不会?请自觉去面壁)。考虑我们将1/7(七分之一)写成小数的时候是如何做的?用1除以7,得到的商就是小数部分,剩下的余数我们继续除以7,一直除到什么时候结束呢?有两种情况:1.如果余数为0。yeah!终于结束了,洗洗睡吧2.当除到某一步时,余数等于1…停!stop!等

6、一下,我发现有什么地方怪怪的。余数为1,余数如果为1的话,再继续除下去,不就又是1/7了吗?绕了一个大弯,又回来了?对,你猜的很对,它永远不会结束,它循环了。注意我上面说的情况2,我们判断他循环,并不是从直观看感觉它重复了,而是因为在计算过程中,它又回到了开头。为什么这么说呢?当你计算一个分数时,它总是连续出现5,出现了好多次,例如0.5555555…你也无法断定它是无限循环的,比如一亿分之五。记得高中时,从一本数学课外书学到了手动开平方的方法,于是很兴奋的去计算2的平方根,发现它的前几位是1.414,

7、哇,原来「2的平方根」等于1.414141…。很多天以后,当我再次看到我的笔记时,只能苦笑了,「2的平方根」不可能循环啊,它可是一个无理数啊。你可能不耐烦了,叽哩哇啦说这么多,有用吗?当然有用了,以后如果MM问你:你会爱我到什么时候?你可以回答她:我会爱你到1/7的尽头。难道我会把我的表白方式告诉你们吗?我对你的爱就像圆周率,无限——却永不重复。扯远了,现在会到主题。你也许会说:我明白了,循环小数不能精确表示,放到计算机中会丢失精度;那么有限小数可以精确表示吧,比如0.1。对于无限小数,不只是计算机不能

8、精确表示,即使你用别的办法(省略号除外),比如纸、黑板、写字板…都无法精确表示。什么?手机?也不能,当然不能了。不,不,iPad也不行,1万买的也不行,真的,再贵的本子也写不下。哪些数能精确表示?那么0.1在计算机中可以精确表示吗?答案是出人意料的,不能。在此之前,先思考个问题:在0.1到0.9的9个小数中,有多少可以用二进制精确表示呢?我们按照乘以2取整数位的方法,把0.1表示为二进制(我假设那些不会进制转换的同学已经补习完了):(1)0

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。