生成下一个最大或最小可表示的浮点数而不会产生比特错误

时间:2011-09-13 20:59:36

标签: c++ floating-point

给定一个任意有限的浮点数,有没有办法确定下一个可表示的浮点数?例如,给定1.0f,根据定义,下一个最大可表示的数字是1.0f + std :: numeric_limits< float> :: epsilon()。有没有一种方法可以合成任何值的epsilon - 而不仅仅是1.0f - 而不需要依赖于对机器如何表示浮点值的位置和/或显式知识?

2 个答案:

答案 0 :(得分:21)

在C ++ 11中,您使用std::nextafter()。缺少这一点,在C99系统上,您使用C数学库中的nextafterfnextafternextafterl(对于类型floatdouble和{分别为{1}}。

答案 1 :(得分:3)

int exponent;
significand= frexp(number, &exponent);
significand+= epsilon;
next= ldexp(significand, exponent);

这样做是提取尾数,用浮点epsilon递增尾数,然后重建浮点数。这应该是你可以通过摆弄尾数位(和尾数溢出的指数)得到的下一个可表示的数字。