std::numeric_limits<double>::epsilon() 可以用来做什么?

What can std::numeric_limits<double>::epsilon() be used for?

本文关键字:什么 gt limits numeric lt double epsilon std      更新时间:2023-10-16
unsigned int updateStandardStopping(unsigned int numInliers, unsigned int totPoints, unsigned int sampleSize)
{
double max_hypotheses_=85000;
double n_inliers = 1.0;
double n_pts = 1.0;
double conf_threshold_=0.95
for (unsigned int i = 0; i < sampleSize; ++i)
{
n_inliers *= numInliers - i;//n_linliers=I(I-1)...(I-m+1)
n_pts *= totPoints - i;//totPoints=N(N-1)(N-2)...(N-m+1)
}
double prob_good_model = n_inliers/n_pts;
if ( prob_good_model < std::numeric_limits<double>::epsilon() )
{
return max_hypotheses_;
}
else if ( 1 - prob_good_model < std::numeric_limits<double>::epsilon() )
{
return 1; 
}
else 
{
double nusample_s = log(1-conf_threshold_)/log(1-prob_good_model);
return (unsigned int) ceil(nusample_s); 
}
}

下面是一个选择语句:

if ( prob_good_model < std::numeric_limits<double>::epsilon() )
{...}

据我了解,判断陈述与(或近似)相同

prob_good_model < 0

那么我是否正确,除此之外std::numeric_limits<double>::epsilon()在哪里可以使用?

epsilon 的目的是让你(相当)容易地找出两个数字之间可以看到的最小差异。

不过,您通常不会完全按原样使用它。您需要根据要比较的数字的大小来缩放它。如果你有两个大约 1e-100 的数字,那么你会使用以下顺序:std::numeric_limits<double>::epsilon() * 1.0e-100作为比较标准。同样,如果你的数字在 1e+100 左右,你的标准将是std::numeric_limits<double>::epsilon() * 1e+100.

如果您尝试在不缩放的情况下使用它,您可能会得到严重错误(完全无意义)的结果。例如:

if (std::abs(1e-100 - 1e-200) < std::numeric_limits<double>::epsilon())

是的,这将显示为"真实"(即说两者相等),即使它们相差 100 个数量级。在另一个方向上,如果数字远大于 1,与(未缩放的)epsilon 相比相当于说if (x != y)- 它根本没有四舍五入误差的空间。

至少根据我的经验,为浮点类型指定的epsilon通常没有多大用处。通过适当的缩放,它会告诉您给定幅度的两个数字之间可能存在的最小差异(对于特定的浮点实现)。

然而,在实际使用中,实际用途相对较少。更实际的数字通常基于输入的精度,以及由于四舍五入(等)而可能丢失的精度量的估计值。

例如,假设您从测量精度为百万分之一的值开始,并且您只进行了几次计算,因此您认为由于舍入误差,您可能损失了多达 2 位精度。在这种情况下,你关心的"epsilon"大约是1e-4,根据你正在处理的数字的大小。也就是说,在这种情况下,您可以期望 4 位精度量级是有意义的,因此如果您看到前四位数字的差异,则可能意味着值不相等,但如果它们仅在第五位(或更晚)位不同,您可能应该将它们视为相等。

事实上,你使用的浮点类型可以表示(例如)16位精度并不意味着你使用的每个测量值都会接近精确 - 事实上,基于物理测量的任何值都有希望接近这个精度是相对罕见的。但是,它确实限制了您可以从计算中获得的期望 - 即使您从一个精确到30位的值开始,计算后您可以希望的最大值将由std::numeric_limits<T>::epsilon定义。

它可以用于未定义函数的情况,但此时您仍然需要一个值。你会失去一点准确性,尤其是在极端情况下,但有时没关系。

比如说,你在某处使用1/x,但 x 的范围是 [0, n[.你可以改用1/(x + std::numeric_limits<double>::epsilon()),以便仍然定义 0。话虽如此,您必须小心如何使用该值,它可能不适用于每种情况。