首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::numeric_limits<double>::epsilon()可以用于什么?

std::numeric_limits<double>::epsilon()可以用于什么?
EN

Stack Overflow用户
提问于 2018-01-07 01:32:06
回答 2查看 12.6K关注 0票数 9
代码语言:javascript
复制
  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); 
        }
    }

下面是一条选择语句:

代码语言:javascript
复制
if ( prob_good_model < std::numeric_limits<double>::epsilon() )
{...}

据我所知,判决声明与(或近似)相同。

代码语言:javascript
复制
prob_good_model < 0

那么,我是否是对的,std::numeric_limits<double>::epsilon()还可以在哪里使用呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-07 03:26:07

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

你通常不会像-就是这样使用它。你需要根据你所比较的数字的大小来缩放它。如果您在1e-100附近有两个数字,那么您将使用std::numeric_limits<double>::epsilon() * 1.0e-100作为您的比较标准。同样,如果您的数字在1e+100附近,则您的标准是std::numeric_limits<double>::epsilon() * 1e+100

如果您尝试使用它而不缩放,您可能会得到严重不正确(完全没有意义)的结果。例如:

代码语言:javascript
复制
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来定义。

票数 16
EN

Stack Overflow用户

发布于 2022-10-27 14:03:29

它可以用于函数未定义的情况,但此时仍然需要一个值。你失去了一些准确性,特别是在极端的情况下,但有时是可以的。

比如,假设您在某个地方使用1/x,但是x的范围是[0,n]。您可以使用1/(x + std::numeric_limits<double>::epsilon())来代替,以便仍然定义0。尽管如此,您必须注意如何使用该值,它可能并不适用于每一种情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48133572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档