gpt4 book ai didi

c++ - std::numeric_limits::epsilon() 可以用来做什么?

转载 作者:行者123 更新时间:2023-12-02 18:07:43 39 4
gpt4 key购买 nike

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

是的,这将显示为“true”(即,两者相等),即使它们相差 100 个数量级。另一方面,如果数字远大于 1,则与(未缩放的)epsilon 相比相当于 if (x != y) --它根本不留任何舍入误差的余地。

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

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

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

您使用的浮点类型可以表示(例如)16 位精度,但这并不意味着您使用的每个测量都将接近精确 - 事实上,这种情况相对较少基于物理测量的结果有希望接近这一精确度。然而,它确实给了你对计算的期望值的限制——即使你从一个精确到 30 位数字的值开始,计算后你能期望的最大值将由下式定义: std::numeric_limits<T>::epsilon .

关于c++ - std::numeric_limits<double>::epsilon() 可以用来做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48133572/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com