Python中的拖尾9

Python中的拖尾9,python,numpy,Python,Numpy,可能重复: 我创建了一个数组,其中numpy为a=numpy.arange(0,1e5,1,dtype=int)a[18645]与预期一样为18645。当我创建另一个数组时,b=a*10e-15,b[18645]是186.499999e-12b[18644]是186.44e-12。为什么Python会创建这些尾随的9 当我试图用numpy.where搜索数组中的元素时,出现了这个问题。对于尾随的9s,numpy.where函数未能在b中找到184.45e-12,这是因为它正在转换为不精确的浮点

可能重复:

我创建了一个数组,其中numpy为
a=numpy.arange(0,1e5,1,dtype=int)
<代码>a[18645]与预期一样为18645。当我创建另一个数组时,
b=a*10e-15
b[18645]
是186.499999e-12<代码>b[18644]是186.44e-12。为什么Python会创建这些尾随的9


当我试图用
numpy.where
搜索数组中的元素时,出现了这个问题。对于尾随的9s,
numpy.where
函数未能在
b
中找到184.45e-12,这是因为它正在转换为不精确的浮点。由于四舍五入错误,您得到的结果不是186.44-这显然是一个略小于186.5的数字,因此所有的9都被打印出来

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

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

将该数字乘以18644得到0.00000000001864400000000000174061801023224352932133873775033107673516497015953063 96484375


正如你所看到的,这仍然是相当准确的。看起来Numpy使用的是单浮点数,这将使误差成倍放大。

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

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

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

将该数字乘以18644得到0.00000000001864400000000000174061801023224352932133873775033107673516497015953063 96484375


正如你所看到的,这仍然是相当准确的。看起来Numpy使用的是单浮点数,这将使错误呈指数级放大。

此表示法是由浮点表示法引起的

当我试图在 带有numpy.where的数组

您不需要测试浮点上的相等性。测试差异是否低于给定的精度。这正是因为浮点运算可能会产生未经验证的结果

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


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

此表示法是由浮点表示法引起的

当我试图在 带有numpy.where的数组

您不需要测试浮点上的相等性。测试差异是否低于给定的精度。这正是因为浮点运算可能会产生未经验证的结果

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


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

显然,9是句号(我不知道英语中的句号是怎样的),你可以在句点或句点后设置符号数:显然,9是句号(我不知道英语中的句号是怎样的),你可以在句点或句点后设置符号数:锑是正确的,有些数字不能用浮点数表示,就像不能用十进制精确地表示1/3的十进制一样。另请参阅,以了解如何在打印时使数组“漂亮地”显示。@AaronS可能更容易的类比是尝试将2.5表示为整数(它必须是2或3)…如果浮点转换在所有方面都是一致的,那么它是有意义的。但正如上面提到的,它不是在b[18644]和b[18645]之间。事实上,在18641年到18646年之间,只有18645年有尾随的9。我修改了numpy.where表达式来解决这个问题(n.where(n.abs(b-186.45e-15)<1e-15))。'mgilson:“nice”打印示例非常有用。谢谢。锑是正确的,有些数字不能用浮点数表示,就像你不能用十进制精确地表示1/3的十进制一样。另请参阅,了解如何使数组在打印时显示得“漂亮”。@AaronS可能更容易的类比是尝试将2.5表示为整数(它必须是2或3)…如果浮点转换在所有方面都是一致的,那么它是有意义的。但正如上面提到的,它不是在b[18644]和b[18645]之间。事实上,在18641年到18646年之间,只有18645年有尾随的9。我修改了numpy.where表达式来解决这个问题(n.where(n.abs(b-186.45e-15)<1e-15))。'mgilson:“nice”打印示例非常有用。谢谢