python4**3的值_为什么4 * 0.1的浮点值在Python 3中看起来不错,但是3 * 0.1没有?

简单的答案是因为量化(舍入)误差导致3 * 0.1!= 0.3(而4 * 0.1 == 0.4,因为乘以2的幂通常是“精确”操作)。

您可以在Python中使用.hex方法来查看数字的内部表示(基本上,精确的二进制浮点值,而不是基本10的近似值)。这可以帮助解释下发生了什么。

>>> (0.1).hex()

'0x1.999999999999ap-4'

>>> (0.3).hex()

'0x1.3333333333333p-2'

>>> (0.1*3).hex()

'0x1.3333333333334p-2'

>>> (0.4).hex()

'0x1.999999999999ap-2'

>>> (0.1*4).hex()

'0x1.999999999999ap-2'

0.1是0x1.999999999999a乘以2 ^ -4。结尾处的“a”表示数字10 – 换句话说,二进制浮点中的0.1比“精确”值0.1稍大(因为最终的0x0.99向上舍入为0x0.a)。当乘以4,2的幂,指数向上移动(从2 ^ -4到2 ^ -2),但是数字不变,所以4 * 0.1 == 0.4。

但是,当乘以3时,0x0.99和0x0.a0(0x0.07)之间的微小差异放大为0x0.15错误,在最后一个位置显示为一位错误。这使得0.1 * 3非常略大于圆整值0.3。

Python 3的float repr被设计为可以往返的,也就是说,显示的值应该可以精确地转换为原始值。因此,它不能以完全相同的方式显示0.3和0.1 * 3,或者两个不同的数字在往返之后将结束相同。因此,Python 3的repr引擎选择显示一个有轻微的明显错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值