对于二进制浮点数系统中的数字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。