你以为你了解了浮点数?真相是很残酷!

小白:大神,咱们开始吧,我今天把数据类型和变量这章学完了呢。

大神:你先谈谈你对浮点数的理解吧。

小白: 浮点数就是带小数点的数呗,和整数相比特点就是计算不精确,但是不知道为什么不精确。

大神:好的,看来你似乎也没啥不理解的,来做个题,判断下0 == 0.0这个表达式是True还是False?

小白:False

大神:那你也False了,不过你现在不用知道原因,反正你知道原因也会忘记。现在就只需要知道,你知道了0 == 0.0是True的。

小白:。。。。。。好吧,默默的跑到编译器里面跑了一遍,还尝试了一下

1 == 0.9999999999999999999居然也是True。

大神:嗯,很多事情不用讲你也会发现的,所以不用上来就告诉你道理,等知道的事情多了,自然就懂道理了。来判断下(10/3-3-1/3)= 0是True还是False?

小白:这个是True,我还在编译环境里面运行了下,哈哈,这次没错了。

大神:嗯,等等,你编译环境是python 2.x,现在我们需要把它更换成3.x,你试着输入(10.0/3.0-3.0-1.0/3.0)看看结果。

小白:好吧,你就是不能让我对一次啊。。。结果是1.6653345369377348e-16这么奇怪啊,无语。

大神:好的,你现在就是体验到了浮点数计算是不精确的实际感受了。接着继续,1e5+1e-5>1e5 成立吗?

小白:True

大神:那么继续1e10+1e-10>1e10呢

小白:还是True

大神:你先计算下1e10 + 1e-1

小白:10000000000.1

大神:那你计算下1e10 + 1e-5

小白:10000000000.00001(这简直逗我数0嘛)

大神:那你在python里面运行下1e10+1e-6看看结果

小白:一脸懵逼了,python里面显示是10000000000.000002

大神:哈哈,你再试试1e10+1e-7,你就明白为什么1e10+1e-10>1e10是False了

小白:好吧,我猜到了这里面有坑,但是我不知道这个坑在小数点后几位

大神:总结下,这个其实是有效位数的问题,python里面15位有效数字准确性是能够保证的,16位就不准确了。

小白:已经懵了,那到底实际原因是啥呢?

大神:这里牵扯到浮点数二进制格式,作为课外作业吧,想搞清楚可以查IEEE 754 手动计算下。

大神:好了,这个其实并不重要,重要的是不要以为数学计算上是0,用浮点数计算也会是0。

编程和学数学不一样,数学需要每一步都正确才能开始下一步,编程因为实践性强,一些问题开始的时候不好解决,可以在后面学习过程中综合起来改。

好了,最后你再试一个7e10+1e-5,看看结果会如何?

小白:我勒个去,为什么python里面算出来会是70000000000.00002

大神:好啦,今天就教(虐)你到这把,IEEE作为课后思考题,你可以去算算。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,497评论 0 17
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx阅读 8,344评论 0 16
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,837评论 18 139
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,610评论 1 118
  • 夕阳西下,最后一抹余光毫不留恋的消失在天边。深吸一口气,我不舍地看了一眼窗外渐渐变暗的橘红色,收回目光扫视车厢。动...
    流水如常阅读 185评论 0 0