在Python中追踪9s

时间:2012-08-24 15:56:49

标签: python numpy

  

可能重复:
  Python rounding error with float numbers

我创建了一个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搜索数组中的元素时,出现了此问题。使用尾随9,numpy.where函数无法在b中找到184.45e-12。

2 个答案:

答案 0 :(得分:5)

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

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

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

将此数字乘以18644得出0.0000000000186440000000000017406180102322435293213387375033107673516497015953063 96484375

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

答案 1 :(得分:0)

此表示由浮点表示引起。

  

当我尝试搜索中的元素时出现了这个问题   数组与numpy.where

您不测试浮点上的相等性。您测试差异是否低于给定的精度。而且这样做恰恰是因为浮点运算可能会产生意想不到的结果。

事实上,numpy基于名为BLASATLAS,它可以从一系列实现中进行选择以执行特定类型的操作(基于机器的状态) )。因此,如果您运行两次相同的程序,您可能会获得不同的结果(如果您打印浮动的完整表示并查看最后的数字)。

这只是一个示例,表明相等测试几乎永远不会在浮点数上以预期的方式工作。