如何找到最近的一个/上一个双值(numeric_limits ::小量的给定数量)(How to f

2019-06-23 15:34发布

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

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)