gpt4 book ai didi

floating-point - 如何确定 double 的最小显着变化

转载 作者:行者123 更新时间:2023-12-04 06:51:45 24 4
gpt4 key购买 nike

我在确定最小值 eps 时遇到问题对于给定的双变量 v以至于

v+eps != v

请注意,这不是典型的问题表任务,因为 eps取决于任意
号码 v .

这不应通过在 for 循环中查找此值来完成。有没有快速的方法来做到这一点,
例如通过位移?独立于编译器、优化标志、平台...

谢谢你的回答

最佳答案

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/

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