给定数字的浮点分辨率

Floating point resolution at a given number

本文关键字:点分 分辨率 数字      更新时间:2023-10-16

我想知道给定值周围浮点数的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 的精确幂,则这两个不会相同。

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