IEEE 754浮点数,1<的最大数是多少?



当使用IEEE 754浮点表示(c++中的double类型)时,非常接近(可表示的)整数的数字被四舍五入到最接近的整数并精确表示。这是真的吗?
在舍入之前,一个数字与最接近的可表示整数到底有多接近?
这个距离是常数吗?
例如,假设1可以精确地表示,小于1的最大double是多少?

当使用IEEE 754浮点表示时(double类型在在c++中,非常接近于(可表示的)整数的数字是四舍五入到最接近的整数,并精确表示。

这取决于该数字是否更接近整数而不是其他可表示的值。0.99999999999999994不等于1,但0.99999999999999995等于。

这个距离是常数吗?

不,它会随着数值的增大而减小,尤其是在指数的增大时。更大的指数意味着尾数覆盖的间隔更大,这反过来意味着整体精度更低。

例如,小于1的最大双精度数是多少?

std::nexttoward(1.0, 0.0)。例:0.999999999999999889 on Coliru.

您将发现与1.0相反方向的更明确的声明1.0和下一个更大的数字之间的差异记录在这里:

std::numeric_limits<double>::epsilon()

根据浮点数的工作方式,下一个较小的数与1.0的距离应该是下一个较大的数与1.0的距离的一半。

低于1的第一个IEEE双精度可以明确地写成0.9999999999999999989,但实际上是0.999999999999988897769753748434595763683319091796875。

距离是而不是常数,它取决于数的指数(因此是大小)。最终,间隙会大于1,这意味着偶数(与奇数相反,奇数是第一个被舍入的整数)整数会被舍入一些(或者,最终,很多)。

递增的IEEE浮点数的二进制表示可以看作递增的整数表示:

示例Hack (Intel):

#include <cstdint>
#include <iostream>
#include <limits>
int main() {
    double one = 1;
    std::uint64_t one_representation = *reinterpret_cast<std::uint64_t*>(&one);
    std::uint64_t lesser_representation = one_representation - 1;
    std::cout.precision(std::numeric_limits<double>::digits10 + 1);
    std::cout << std::hex;
    std::cout << *reinterpret_cast<double*>(&lesser_representation)
              << " [" << lesser_representation
              << "] < " << *reinterpret_cast<double*>(&one_representation)
              << " [" << one_representation
              << "]n";
}
输出:

0.9999999999999999 [3fefffffffffffff] < 1 [3ff0000000000000]

当将整数表示推进到极限时,如果指数位发生变化,则连续浮点数的差值将增加。

参见:http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

当使用IEEE 754浮点表示(c++中的双精度类型)时,非常接近精确整数的数字被舍入到最接近的整数并精确表示。这是真的吗?

这是假的。

一个数字到底要多接近最接近的整型数才能被舍入?

当您执行二进制到字符串转换时,浮点数将使用当前舍入模式四舍五入到当前精度(对于printf系列函数,默认精度为6)。

最新更新