为什么我从std :: cout获得如此精确的浮点数?

时间:2020-09-11 18:36:28

标签: c++ floating-point cout

程序

int main ()
{
    long long ll = LLONG_MAX;
    float f = ll;
    std::cout << ll << '\n';
    std::cout << std::fixed << f << '\n';
    return 0;
}

给予:

9223372036854775807
9223372036854775808.000000

怎么可能?如果23位尾数最多只能有8,388,607个最大值,那么cout为什么输出64位数字?

2 个答案:

答案 0 :(得分:2)

您将2 ^ 63-1存储在一个浮点数中,将其四舍五入为2 ^ 63 =922337203685477575808。2的幂完全可以表示。

可以精确表示的最接近的数字是2 ^ 63 + 2 ^ 40 = 9223373136366403584。

答案 1 :(得分:1)

long long是一种64位数据类型,因此意味着LLONG_MAX的值为2^63 - 1。没错,它不能存储在只有23位尾数的float中,但是比2^63多1的LLONG_MAX很容易存储在浮点数中。它将2存储在尾数中,并将63存储在指数中,就在那里。

相关问题