标题是不言自明的,输入被赋予双倍值,我想添加/减去可能的最小量。
答案 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 */