考虑C++中的“正常”实数TREAL x(不是非正规的,不是NaN/Infinite)(TREAL = floatdoublelong 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><cmath>中具有nextafter,nextafterl和nextafterf函数。使用基本算术和epsilon来实现它们将很繁琐,因为您需要考虑到四舍五入。二进制表示的工作可能更容易,但是我想知道符号和幅度表示的效果以及-0.0的存在(有关所需内容,请参见Fred's answer)。

10-08 14:05