浮点数计算精度丢失问题#W01

前几日电话面试,被问到一个问题: “浮点数计算精度丢失的原因是什么?”啊,啥? 我一脸懵逼,“就是在irb中,0.2+0.4不等于0.6,为什么?“,面试官又补了一句。我没有真正get到问题是什么,胡说了一通。

显然,这是问到了我的知识盲区了,我从来没有遇到过这个问题。于是我打开python命令行,执行了一下:

>>> 0.4 + 0.2
0.6000000000000001
>>>

我又打开Chrome,进入console

0.2 + 0.4

0.6000000000000001

一下子,我get到了这个问题,对于其原因,当然我还是懵逼的,于是我搜索了一下这个问题。浏览过了一些资料,这个问题极大的引起了我的兴趣,除了问题本身所涉及的知识,还有在这篇文章中,我被触动了,因为他说把理科当文科学了的人,我也在内。对于知识的学习,浮躁虚于表面,很多时候只记住了一个结论,但是底层的原因,却并没有去深入探知。对于学习的态度和方式,我也从头反思了一下,摒弃走马观花式的学习,用写作的方式将知识进行结构化,深入到细节。一个点一个点地学习知识,努力做到对于知识的表达能做到: 蔡崇信为什么敢冒这风险 这篇文章中所提到的:”优雅、简洁、有逻辑的表达“。

对于自己这方面的积累和刻意塑造,我想就从本篇文章开始,从这个有意思的问题开始:

为什么浮点数计算时会有精度丢失?

什么是浮点数?

浮点数是计算机表示有理数的一种方式,或者说规范。浮点数和定点数相对应。

什么是定点数呢? 这两个词中的‘点’也就是常说的小数点。定点数就是计算机在表示数字时,小数点的位置是固定的。

比如计算机用2字节二进制数来表示数字,它怎么表示呢? (这里只是演示概念)

2个字节有16位, 把前8位用来表示整数部分,后8位用来表示小数部分,也就是说小数点在了第8位,当然具体定在多少位是可以设置的。用这种方式表示数字8.5时就是这样:

00001000.00001001

这样子,2字节的二进制只能表达2^8 =256个小数,而且范围有限(0 - 2^8),很多时候会浪费空间。有时候我的整数部分比较长,小数部分短,有时候反之。按照之前的方式,范围就会被限制,300.5 这种就没法被表示,需要4字节的空间来表示,那么这就很浪费了。

于是浮点数就出现了。

浮点数在表示的时候,小数点的位置可以根据实际情况移动。


Sign表示是正数还是负数,先不管。

Exponent表示指数部分,和 1.34*10^N 这个数中的N的性质一样,只是前面这个数的基数是10,它的基数是2 。这个部分的值会决定浮动的小数点到底定在哪个位置。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值