为什么我从 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
存储在指数中,就在那里。
节目
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
存储在指数中,就在那里。