考虑 C++ 中的“正常”实数 TREAL x
(不是次正规的也不是 NaN/Infinite)(TREAL
= float
,double
, long double
)
以下是从浮点角度查找上一个和下一个 x
的好解决方案吗?
TREAL xprev = (((TREAL)(1.)) - std::numeric_limits<TREAL>::epsilon()) * x;
TREAL xnext = (((TREAL)(1.)) + std::numeric_limits<TREAL>::epsilon()) * x;
非常感谢。
最佳答案
C99 和 C++11 在 <math.h>
中有 nextafter、nextafterl 和 nextafterf 函数和 <cmath>
.使用基本算术和 epsilon 实现它们会很乏味,因为您需要考虑四舍五入。使用二进制表示可能更容易,但我想知道符号和幅度表示的影响以及 -0.0 的存在(请参阅 Fred's answer 了解需要的内容)。
关于C++ next float with numeric_limits/epsilon?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11159774/