首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用DBL_EPSILON/epsilon

何时使用DBL_EPSILON/epsilon
EN

Stack Overflow用户
提问于 2010-06-24 20:34:44
回答 2查看 12.7K关注 0票数 4

DBL_EPSILON/std::numeric_limits::epsilon将给我最小的值,这将在与一个值相加时产生差异。

我很难理解如何将这些知识应用到有用的东西中。

epsilon比计算机可以处理的最小值大得多,所以使用比epsilon小的值是安全的,这似乎是一个正确的假设。

我使用的值之间的比率应该小于1/epsilon吗?

EN

回答 2

Stack Overflow用户

发布于 2010-06-24 20:52:55

DBL_EPSILON的定义不是这样的。它是1和1之后的下一个可表示数字之间的差(您的定义假设舍入模式设置为“朝向0”或“朝向负无穷大”,这并不总是正确的)。

如果你对数值分析有足够的了解,这是很有用的。但我担心这里不是了解这一点的最好地方。例如,您可以使用它构建一个比较函数,该函数将判断两个浮点数是否近似相等,如下所示

代码语言:javascript
复制
bool approximatively_equal(double x, double y, int ulp)
{
   return fabs(x-y) <= ulp*DBL_EPSILON*max(fabs(x), fabs(y));
}

(但是如果不知道如何确定ulp,你就会迷失方向;如果中间结果是非正规化的,这个函数可能会有问题;fp计算很复杂,难以保证健壮性)

票数 4
EN

Stack Overflow用户

发布于 2016-02-07 19:46:00

根据X的不同,XX的下一个值之间的差异会有所不同。

DBL_EPSILON只是11的下一个值之间的差异。

您可以使用std::nextafter来测试两个epsilon差异的double

代码语言:javascript
复制
bool nearly_equal(double a, double b)
{
  return std::nextafter(a, std::numeric_limits<double>::lowest()) <= b
&& std::nextafter(a, std::numeric_limits<double>::max()) >= b;
}

如果你想测试两个具有因子*ε差异的double,你可以使用:

代码语言:javascript
复制
bool nearly_equal(double a, double b, int factor /* a factor of epsilon */)
{
  double min_a = a - (a - std::nextafter(a, std::numeric_limits<double>::lowest())) * factor;
  double max_a = a + (std::nextafter(a, std::numeric_limits<double>::max()) - a) * factor;

  return min_a <= b && max_a >= b;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3109941

复制
相关文章

相似问题

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