[python3教程]第十五章.浮点算数的问题和限制(Floating point Arithmetic:Issues and Limitations)

浮点数在硬件中其实是以分母为2的分数,比如0.125可以表示为1/10+2/100+5/1000也可以表示为0/2+0/4+1/8。这两个分数拥有完全相同的值,唯一的区别就是第一个使用10做分母,第二个使用2作分母。
不幸的是,大部分的小数是不能用2进制的分数表示的,而且还有超越数的存在,肯定不能表示出所有的数字。这导致的后果就是,一般情况我们存入计算机的小数都是近似的,他们都是用二进制分数保存的。
这个问题其实很好明白,在十进制中我们看看1/3这个分数,我们可以近似的保存为0.3,更加精确可以保存为0.33或者0.333或者更多位。但是无论你向后写了多少位,结果永远都不会是真正的1/3,但是会不断地更加趋近1/3。
同样的道理在二进制分数中,无论你写多少数都不能准确的表达0.1这个小数。用二进制表示就是0.0001100110011001100110011001100110011001100110011…他会在很多位后停止,然后你就会得到一个近似值。在大部分计算机中,浮点型都是使用二进制分数来保存近似值的;一般使用前53位作为分子,分母这是一个2的多次幂。(但是我用bin函数返回0.1的分子,结果是54位,哪位大神知道可以赐教一下)0.1在二进制分数中就是3602879701896397 / 2 ** 55这个结果已经和接近了,虽然他并不是真正的0.1。
很多用户并不知道这是近似值,因为我们的表示的就是0.1而不是其他的形式。python会表示一个近似值趋近的值。而事实上这个值其实是0.1000000000000000055511151231257827021181583404541015625。后面的许多位对于大多数用户来说都没什么用,所以python会直接把他取整。所以我们需要记住,即使展示出来的值是0.1但是它其实是一个二进制分数的近似值。
有趣的是,很多不同的小数使用同样的二进制近似值。比如0.1和0.10000000000000001和0.1000000000000000055511151231257827021181583404541015625,他们都被当作同样的近似值来储存。
这在浮点数的二进制储存中是很正常的,不单单是在python中,在任何一个编程语言中都是这样的。
当然为了更好看,你可以使用format来设定显示出你想要的位数:

>>> format(math.pi, '.12g') # give 12 significant digits
'3.14159265359'
>>> format(math.pi, '.2f') # give 2 digits after the point
'3.14'
>>> repr(math.pi)
'3.141592653589793'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值