标题是相当不言自明的,输入被赋予双重价值,我想添加/对。减去最小量可能。
Answer 1:
如果你的编译器实现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);
即使你的编译器不支持它,它可能有它的禀。 (MSVC已_nextafter
自2005年以来,例如,GCC可能实现它为标准。)
如果你的编译器不支持它,但加速是提供给你,你可以这样做:
#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头文件并复制。
Answer 2:
这里是一个非常肮脏的把戏,实际上不是合法且仅当您的平台使用IEEE754工作浮动:浮动的二进制表示以同样的方式作为浮点值是有序的,这样你就可以增加二进制表示:
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正常了。
Answer 3:
怎么样:
x += fabs(x) * std::numeric_limits<double>::epsilon();
Answer 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
文章来源: How to find nearest next/previous double value (numeric_limits::epsilon for given number)