2011-07-29 50 views
4

从一个浮点数中减去一个数组时,我遇到了python自动舍入很小数字(小于1e-8)的问题。以这个例子:在Python中减去numpy数组时发生不必要的四舍五入

import numpy as np 
float(1) - np.array([1e-10, 1e-5]) 

任何想法如何强制蟒蛇不轮?这迫使我在某些情况下除以零,并成为一个问题。从numpy数组中减去时会出现同样的问题。

+0

我有同样的问题提高1的幂小数,并将它们舍入为0. – mike

+1

奇怪,你得到downvote ...这是一个很好的问题,i.m.o. –

回答

6

大多数情况下,它只是无所事事浪费你numpy的阵列的repr

考虑你上面的例子:

import numpy as np 
x = float(1) - np.array([1e-10, 1e-5]) 
print x 
print x[0] 
print x[0] == 1.0 

这产生了:

[ 1.  0.99999 ] 
0.99999999999 
False 

所以第一个元素是不实际为零,它只是numpy的阵列的漂亮打印一下显示这种方式。

这可以通过numpy.set_printoptions.

当然,numpy的是fundementally利用有限的精度浮点值来控制。 numpy的全部要点是为类似数据的数组提供一个内存高效的容器,所以在numpy中没有相应的类。

然而,64位浮点数有一个不错的精度范围。 1e-10和1e-5不会造成太多问题。如果你需要,还有一个numpy.float128 dtype,但操作将比使用本地浮点数慢得多。

+0

我没有想到这一点,但你是绝对正确的..永远不要相信仅仅是一些东西的表示! +1 – redShadow

1

我想所有依赖于非常小的浮点数的处理,由Python和底层的C库,在某一点往往会失去精度。

如果你需要的精度,恕我直言,你应该依赖于不同的东西,比如断片的数量等该级别

我不知道是否已经有东西来处理,但如果你能设法以不同的方式表示数字(例如1/100000000001/100000),然后仅在所有计算结束时计算浮点结果,则应避免所有这些问题。

(当然,你需要一些类,自动地处理断片的计算,以避免重新实现公式等)