给定数字的浮点分辨率

Floating point resolution at a given number

我想知道给定值附近的浮点数的 epsilon。

std::numeric_limits<floating_point_type>::epsilon() 仅针对数字 1.0 提供,而我希望函数适用于任何数字。

有没有标准库解决这个问题?如果没有 - 我应该如何实现该功能?

嗯,找到值上方的 epsilon(即从该值到下一个可表示值的距离)的最简单解决方案就是

std::nextafter(x, std::numeric_limits<floating_point_type>::infinity()) - x

类似地,要找到低于该值的 epsilon,您可以这样做

x - std::nextafter(x, -std::numeric_limits<floating_point_type>::infinity())

请注意,如果 x 恰好是 2 的幂,则这两个值将不同。

现在,有一个 轻微 警告:FLT_MAX 以上计算的 epsilon 将是无穷大(可以说是 一种 正确答案,但它与 IEEE-754 的舍入规则不太匹配)并且无穷大上方的 epsilon 将是 NaN(我不知道我对此有何看法)。在所有其他情况下,结果将是准确的。