Computer science 有没有考虑数值返回等于零的阈值?
e-10小到可以被认为是零,是e-16还是其他值 还是取决于软件包或应用程序?数值分辨率是否有一个一般限制,低于该限制,考虑输出的信息量将不超过零Computer science 有没有考虑数值返回等于零的阈值?,computer-science,precision,numeric,Computer Science,Precision,Numeric,e-10小到可以被认为是零,是e-16还是其他值 还是取决于软件包或应用程序?数值分辨率是否有一个一般限制,低于该限制,考虑输出的信息量将不超过零 编辑: 这是问题的来源:我在MathSE上发布了一篇文章,原本应该是空空间的“廉价计算证明”的文章如下所示: if (value == 0.0) 在Matlab中: A = [1 3; 1 2; 1 -1; 2 1]; rank(A); [U,S,V] = svd(A); left_null_A = transpose(U); rows = (
编辑: 这是问题的来源:我在MathSE上发布了一篇文章,原本应该是空空间的“廉价计算证明”的文章如下所示:
if (value == 0.0)
在Matlab中:
A = [1 3; 1 2; 1 -1; 2 1];
rank(A);
[U,S,V] = svd(A);
left_null_A = transpose(U);
rows = (rank(A) + 1): size(left_null_A,1);
left_null_A = left_null_A(rows,:)
(left_null_A(1,:) + left_null_A(2,:)) * A
%ans =
% -7.2164e-016 5.5511e-017
及
在Python中:
import numpy as np
A = np.matrix([[1,3], [1,2], [1, -1], [2,1]])
rank = np.linalg.matrix_rank(A)
U, s, V = np.linalg.svd(A, full_matrices = True)
t_U_A = np.transpose(U)
nrow = t_U_A.shape[0]
left_null_A = t_U_A[rank:nrow,:]
np.dot((left_null_A[0,:] + left_null_A[0,:]), A)
# Out[2]: matrix([[ -4.44089210e-16, -2.10942375e-15]])
及
在R中:
及
确实是非常小的数字,但我能说它们是0而不需要借助计算背后的数学吗?如果你的问题是关于一阶最优性度量(优化一阶导数),我会说答案很大程度上取决于你使用的尺度。假设您使用的是一个
外生gdp
,其数值可以在1.e12左右,并且您的数值分辨率包括制作一个内生系统,该系统产生的内生gdp
,等于外生gdp
,如下所示
x = -1. + endogenous_gdp/exogenous_gdp
假设从这个相对(比率)均衡中,我们得到x=1.e-10
。正如你所看到的,在这种情况下,1.e-10
不是很好,因为它意味着内生的gdp
是1.e-10
大于外生的gdp
。如果gdp
等于1.e12,您的非相对(差异)利差将1.e-10*1.e12=100
。你可以用非相对的术语直接做,就像
x = endogenous_gdp - exogenous_gdp
这一次x=1.e-10
,非相对的,可以认为没有那么糟糕,因为相对价差1.e-10/1.e-12=1.e-22
相反,但以同样的方式,如果我们使用1.e-8左右的值,最终获得的非相对和相对差异将分别为1.e-10*1.e-8=1.e-18
和1.e-10/1.e-8=1%
。这一次,这是后者不太好
最后,在这一点上,您将不得不考虑是否需要。Being说,注意,例如,实际上遵循标准
如果您的问题是关于收敛,那么请知道,例如,python的函数使用1.49012e-08
作为收敛阈值。重复使用前面的例子,这将包括计算(相对而言),作为第n次迭代
x(n) = -1. + endogenous_gdp(n)/exogenous_gdp
x(n+1) = -1. + endogenous_gdp(n+1)/exogenous_gdp
然后,作为(n+1)次迭代
x(n) = -1. + endogenous_gdp(n)/exogenous_gdp
x(n+1) = -1. + endogenous_gdp(n+1)/exogenous_gdp
最终将相对误差计算为
y = abs( -1. + x(n+1)/x(n) )
如果
y
低于1.49012e-08,则视为已收敛。在某个点,需要将10^-X视为零。大概是这样的:
if (value == 0.0)
只会带来麻烦。对于任何类型的浮点比较,都需要定义一些增量
该增量的大小取决于应用程序。如果你在做分子模拟,一次选举的质量大约是10^-30千克。在这种情况下,您的增量需要远远小于10^-30
在CAD应用程序中,增量通常可按文件配置。如果要制作建筑模型,请以米为单位测量,增量可能为0.0001(1/10 mm)。使用相同的应用程序以米为单位设计玩具,增量可能为0.000001
请注意,如果在CAD文件中使增量过大,则会删除细节。如果将其设置得太小,则应该重合的点不存在
请记住,IEEE双格式支持的范围为-1022。因此,即使有很多舍入和误差传播,您也可以使增量非常小。ε随值而变化。你不应该用固定的ε谢谢!(+1). 我想知道你是否可以看一看编辑的作品。谢谢!(+1). 我想知道你是否可以看一下对OP的编辑。
if (value == 0.0)