繁体   English   中英

为什么我从 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 = 92233731363666403584。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM