0

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

我用 numpy as 创建了一个数组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.

4

2 回答 2

5

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

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

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

将此数字乘以 18644 得到 0.0000000000186440000000000017406180102322435293213387375033107673516497015953063 96484375

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

于 2012-08-24T15:59:34.080 回答
0

这种表示是由浮点表示引起的。

当我尝试使用 numpy.where 在数组中搜索元素时出现此问题

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

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

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

于 2012-08-24T16:06:39.277 回答