"about zero" 的实际浮点值
Realistic float value for "about zero"
我正在开发一个具有相当复杂数字的程序,主要是在具有复杂数据类型的 numpy 中。一些计算返回几乎为空的数组,其中的复数分量几乎为零。例如:
(2 + 0j, 3+0j, 4+3.9320340202e-16j)
显然第三个分量基本上为 0,但无论出于何种原因,这是我的计算结果,结果表明对于其中一些几乎为零的值,np.is_complex()
returns 正确。与其深入研究那些大代码,我认为只应用一个截止值是明智的。我的问题是,什么是一个合理的截止点,低于它的任何东西都应该被认为是零? 0.00? 0.000000?等...
我知道这些值是由于浮点数学中的舍入误差造成的,我只是想明智地处理它们。 tolerance/range 允许这样的精度误差是多少?我想将它设置为一个参数:
ABOUTZERO=0.000001
正如其他人评论的那样,'almost zero' 的构成确实取决于您的特定应用程序,以及您预期的舍入误差有多大。
如果您必须使用硬阈值,一个合理的值可能是 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
我正在开发一个具有相当复杂数字的程序,主要是在具有复杂数据类型的 numpy 中。一些计算返回几乎为空的数组,其中的复数分量几乎为零。例如:
(2 + 0j, 3+0j, 4+3.9320340202e-16j)
显然第三个分量基本上为 0,但无论出于何种原因,这是我的计算结果,结果表明对于其中一些几乎为零的值,np.is_complex()
returns 正确。与其深入研究那些大代码,我认为只应用一个截止值是明智的。我的问题是,什么是一个合理的截止点,低于它的任何东西都应该被认为是零? 0.00? 0.000000?等...
我知道这些值是由于浮点数学中的舍入误差造成的,我只是想明智地处理它们。 tolerance/range 允许这样的精度误差是多少?我想将它设置为一个参数:
ABOUTZERO=0.000001
正如其他人评论的那样,'almost zero' 的构成确实取决于您的特定应用程序,以及您预期的舍入误差有多大。
如果您必须使用硬阈值,一个合理的值可能是 machine epsilon,它被定义为由于浮点运算舍入而导致的相对误差的上限。直观地说,它是最小的正数,当与 1.0 相加时,使用给定的浮点表示和舍入方法给出 >1.0 的结果。
在 numpy 中,您可以使用 np.finfo
:
import numpy as np
print(np.finfo(float).eps)
# 2.22044604925e-16
print(np.finfo(np.float32).eps)
# 1.19209e-07