我正在开发一个具有相当复杂的数字的程序,主要是在具有复杂数据类型的numpy中。一些计算返回几乎为空的数组,复杂的组件几乎为零。例如:
(2 + 0j, 3+0j, 4+3.9320340202e-16j)
显然第三个组件基本上是0,但无论出于何种原因,这是我的计算结果,结果发现,对于其中一些几乎为零的值,np.is_complex()
返回True。我认为仅应用截止值是明智的,而不是挖掘那些大代码。我的问题是,什么是合理的截止点,以下任何东西都应该被视为零? 0.00? 0.000000?等...
据我所知,这些值是由浮点数学中的舍入误差引起的,只是想明智地处理它们。允许这种精度误差的公差/范围是多少?我想将它设置为参数:
ABOUTZERO=0.000001
答案 0 :(得分:1)
正如其他人评论的那样,构成“几乎为零”的内容确实取决于您的特定应用,以及您对舍入错误的预期程度。
如果必须使用硬阈值,则合理的值可能是machine epsilon,它被定义为由于浮点运算的舍入而导致的相对误差的上限。直观地,它是最小的正数,当添加到1.0时,使用给定的浮点表示和舍入方法给出结果> 1.0。
在numpy中,您可以使用np.finfo
获取特定浮点类型的机器epsilon:
import numpy as np
print(np.finfo(float).eps)
# 2.22044604925e-16
print(np.finfo(np.float32).eps)
# 1.19209e-07