在Python中追踪9s

gre*_*rer 0 python numpy

可能重复:
带有浮点数的Python舍入错误

我用numpy创建了一个数组a = numpy.arange(0,1e5,1,dtype=int).a[18645]是预期的18645.当我创建另一个数组时b=a*10e-15,b[18645]是186.4999999999e-12.b[18644]是186.44e-12.为什么Python会创建这些尾随9?

当我试图在数组中搜索元素时出现了这个问题numpy.where.使用尾随的9s,该numpy.where功能未能找到184.45e-12 in b.

Ant*_*ony 5

那是因为它正在转换为浮点数,这不是精确的.由于舍入误差,你得到的结果不是186.44 - 它显然是略低于186.5的数字,因此所有的9都被打印出来.

这里实际上有几个错误来源.首先,1e-15不能完全表示为浮点.其次,乘法可能会引入更多错误.最后,结果必须转换回十进制,但它有助于在打印时截断结果.

一些琐事 - 1e-15转换为双精度正好是0.000000000000000000000000000000007770539987666107923830718560119501514549256171449087560176849365234375

将此数字乘以18644得到0.0000000000186440000000000017406180102322435293213387375033107673516497015953063 96484375

如您所见,这仍然相当准确.似乎Numpy正在使用单个浮点数,这会以指数方式放大错误.