对于二进制浮点数系统中的数字x,最后一位的单位定义为ulp(x) = 2^{E(x)} * 2^{1 - p} = 2^{E(x)}*epsilon,其中指数是用来表示x 的以2为底的指数,p是数字格式的精度(53用于( double 格式),而epsilon = 2^{1-p}是机器公差。

在查看std::numeric_limits时,我希望找到类似std::numeric_limits<double>::ulp(x)的内容,但这似乎不可用。或类似std::numeric_limits<double>::exponent(x)的东西,我可以将它与std::numeric_limits<double>::epsilon()相乘,但不存在。 boost中似乎提供了ulp函数。

I can code something myself,但是如果有的话,我宁愿使用标准化代码。我错过了文档中的某些内容吗?

编辑:为了更清楚一点,我在说的是浮点数x的指数的计算,而不是浮点数格式(类型)的min_max_指数范围。

最佳答案

标准库确实没有ulp函数。



可以用以下公式计算:

int exp;
std::frexp(std::fabs(x), &exp);
double result = std::ldexp(std::numeric_limits<double>::epsilon(), exp - 1);

注意:仅对正常浮点值正确。对于非正常值,甚至可能甚至不存在可以表示ULP的浮点值。


numeric_limits仅包含常量(或返回常量的函数)。它没有执行计算的任何功能,因此也没有接受输入值的功能。 <cmath> header 具有计算功能。

作为一般读者的补充说明:如果您打算查找下一个/上一个可表示的值,请使用nextafter系列函数,而不是添加/减去ULP。

10-05 21:00