python中fmod什么意思_python – 为什么fmod(1.0,0.1)== .1?

因为0.1不是0.1;该值不能以双精度表示,因此它会四舍五入到最接近的双精度数,这正是:

0.1000000000000000055511151231257827021181583404541015625

当你调用fmod时,你得到除以上面列出的值的除法余数,这恰好是:

0.0999999999999999500399638918679556809365749359130859375

打印时会舍入到0.1(或者可能是0.09999999999999995).

换句话说,fmod工作得很好,但是你没有给它你认为你的输入.

编辑:你自己的实现给你正确的答案,因为它不太准确,信不信由你.首先,请注意fmod计算余数而没有任何舍入误差;唯一不准确的来源是使用值0.1引入的表示错误.现在,让我们逐步完成您的实现,并查看它产生的舍入错误如何完全取消表示错误.

一次一步地评估a – floor(a / n)* n,跟踪每个阶段计算的确切值:

首先我们评估1.0 / n,其中n是最接近0.1的双精度近似,如上所示.这种划分的结果大约是:

9.999999999999999444888487687421760603063276150363492645647081359...

请注意,此值不是可表示的双精度数 – 因此它将被舍入.要查看这种舍入是如何发生的,让我们看一下二进制而不是十进制的数字:

1001.1111111111111111111111111111111111111111111111111 10110000000...

空格表示舍入到双精度的位置.由于圆点之后的部分大于精确的中间点,因此该值精确到10.

可预见地,10.0(10.0).所以剩下的就是计算1.0 – 10.0 * 0.1.

在二进制中,10.0 * 0.1的确切值是:

1.0000000000000000000000000000000000000000000000000000 0100

同样,该值不能表示为double,因此在空格指示的位置处舍入.这次它向下舍入到1.0,因此最终计算是1.0 – 1.0,当然是0.0.

您的实现包含两个舍入错误,恰好抵消了在这种情况下值0.1的表示错误.相比之下,fmod总是精确的(至少在具有良好数值库的平台上),并且暴露表示误差为0.1.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值