作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在确定最小值 eps
时遇到问题对于给定的双变量 v
以至于
v+eps != v
eps
取决于任意
v
.
最佳答案
C99 功能 nextafter
是你所需要的。或者,使用 Boost.Math 的 nextafter
.这是由定义定义的实现(它依赖于内存中 double
的内部表示)。
有关撰写本文时此处答案中提供的所有方法的比较,请参阅 a live demo看看其他解决方案是如何失败的。
作为引用,如果您想在我们自己的系统上运行它,这里是测试代码:
#include <cmath>
#include <cfloat>
#include <limits>
#include <iostream>
using std::cout;
#include <iomanip>
using std::setprecision;
#include <boost/math/special_functions/next.hpp>
double
epsFor( double x )
{
union
{
double d;
unsigned long long i;
} tmp;
tmp.d = x;
++ tmp.i;
return tmp.d - x;
}
void test(double d)
{
double d1 = std::nextafter(d,DBL_MAX);
double d2 = d+std::numeric_limits<double>::epsilon() * d;
double d3 = d+epsFor(d);
double d4 = boost::math::nextafter(d, DBL_MAX);
cout << setprecision(40)
<< "For value of d = " << d << '\n'
<< " std::nextafter: " << d1 << '\n'
<< " Boost solution: " << d4 << '\n'
<< " undefined beh.: " << d3 << '\n'
<< " numeric_limits: " << d2 << '\n';
}
int main()
{
test(0.1);
test(986546357654.354687);
}
关于floating-point - 如何确定 double 的最小显着变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19291856/
我是一名优秀的程序员,十分优秀!