Computer science 有没有考虑数值返回等于零的阈值?

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 = (

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 = (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)