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

Why do I get so precise floating-point number from std::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^63-1 存储在一个浮点数中,它四舍五入为 2^63 = 9223372036854775808。2 的幂可以精确表示。

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

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