如何找到最近的下一个/上一个double值(给定数字的numeric_limits :: epsilon)

时间:2012-04-15 06:38:17

标签: c++ floating-point double

标题是不言自明的,输入被赋予双倍值,我想添加/减去可能的最小量。

4 个答案:

答案 0 :(得分:23)

如果你的编译器实现了C99的数学函数/ C ++ 11,你可以使用nextafter

#include <cfloat> // DBL_MAX
#include <cmath> // std::nextafter

double x = 0.1;

// next representable number after x in the direction of DBL_MAX
double xPlusSmallest = std::nextafter(x, DBL_MAX); 

即使您的编译器不支持它,它也可能具有内在性。 (例如,自2005年以来,MSVC已经_nextafter。GCC可能会将其作为标准实施。)

如果您的编译器不支持它,但可以使用Boost,则可以执行以下操作:

#include <boost/math/special_functions/next.hpp> // boost::float_next

double x = 0.1;

// next representable number after x
double xPlusSmallest = boost::math::float_next(x); 

这相当于此(模拟C99):

#include <boost/math/special_functions/next.hpp> // boost::nextafter
#include <cfloat> // DBL_MAX

double x = 0.1;

// next representable number after x in the direction of DBL_MAX
double xPlusSmallest = boost::math::nextafter(x, DBL_MAX); 

如果这些都不适合你,你只需要打开Boost标题并复制它。

答案 1 :(得分:7)

这是一个非常脏的技巧,实际上并不合法,只有在你的平台使用IEEE754浮点数时才有效:浮点数的二进制表示方式的顺序与浮点值相同,因此你可以增加二进制表示: / p>

double x = 1.25;

uint64_t * const p = reinterpret_cast<uint64_t*>(&x);

++*p;   // undefined behaviour! but it gets the next value

// now x has the next value

通过通常的二元复制体操来获得合适的uint64_t值,你可以完全合法地达到同样的效果。确保正确检查零,无穷大和NaN。

答案 2 :(得分:-2)

怎么样:

x += fabs(x) * std::numeric_limits<double>::epsilon();

答案 3 :(得分:-4)

#define FLT_MIN         1.175494351e-38F        /* min positive value */
#define FLT_MAX         3.402823466e+38F        /* max value */
#define DBL_MIN         2.2250738585072014e-308 /* min positive value */
#define DBL_MAX         1.7976931348623158e+308 /* max value */

http://xona.com/2006/07/26.html