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

不是特定于Python的实现,但应该适用于任何浮点数到十进制字符串函数。

浮点数本质上是一个二进制数,但采用科学记数法,具有固定的有效数字限制。

具有未与基础共享的素数因子的任何数的倒数将始终导致重复点点表示。例如,1/7有一个素数因子7,它不与10共享,因此具有重复的十进制表示,对于具有素数因子2和5的1/10,情况也是如此,后者不与2共享;这意味着0.1点不能用点数后的有限位数来精确表示。

由于0.1没有精确的表示,因此将近似值转换为小数点字符串的函数通常会尝试近似某些值,这样它们就不会得到不直观的结果,如0.1000000000004121。

由于浮点是科学记数法,因此乘以基数幂只会影响数字的指数部分。例如,1.231e + 2 * 100 = 1.231e + 4表示十进制表示法,同样,1.00101010e11 * 100 = 1.00101010e101表示二进制表示法。如果我乘以基数的非幂,有效数字也会受到影响。例如1.2e1 * 3 = 3.6e1

根据所使用的算法,它可能会尝试仅基于有效数字来猜测常见小数。 0.1和0.4都具有相同的二进制有效数字,因为它们的浮点数基本上分别为(8/5)(2 ^ -4)和(8/5)(2 ^ -6) 。如果算法将8/5 sigfig模式识别为十进制1.6,那么它将在0.1,0.2,0.4,0.8等上工作。它也可能具有其他组合的魔法sigfig模式,例如float 3除以float 10和统计上可能通过除以10形成的其他魔法模式。

在3 * 0.1的情况下,最后几个有效数字可能与将浮点数3除以浮点数10不同,导致算法无法识别0.3常数的幻数,具体取决于其对精度损失的容忍度

有趣的是,有许多不同的十进制数共享相同的最接近的近似二进制分数。例如,数字0.1和0.10000000000000001和0.1000000000000000055511151231257827021181583404541015625都近似为3602879701896397/2 ** 55.由于所有这些十进制值共享相同的近似值,因此可以显示其中任何一个,同时仍保留不变eval(repr(x) )== x。

如果浮点x(0.3)不完全等于浮点数y(0.1 * 3),则精度损失没有容差,则repr(x)不完全等于repr(y)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值