gpt4 book ai didi

c++ - 奇怪的 unsigned long long int 行为

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:26 26 4
gpt4 key购买 nike

我正在使用 unsigned long long int 进行一些计算,但是

std::cout << std::setprecision(30) << 900000000000001i64+4*pow(10, 16);

给出输出:40900000000000000

还有这个

std::cout << std::setprecision(30) << 900000000000011i64+4*pow(10, 16);

给出输出:40900000000000008

现在我不知道发生了什么 我尝试删除 i64 尝试打印 4*pow(10, 16) 给出正确的结果 40000000000000000 还尝试直接打印 40900000000000011,它打印了正确的结果。它适用于 10^14 的幂,但在那之后它开始表现得很奇怪。

谁能解释一下发生了什么?

最佳答案

你得到这个尴尬结果的原因是因为丢失了 double 类型中最低有效位的值。 double 尾数只能容纳大约 15 位十进制数字和恰好 52 位二进制数字 ( wiki )。

900000000000001i64+4*pow(10, 16) 将转换为双修剪所有低位。在你的情况下,有 3 个。

例子:

std::cout << std::setprecision(30);
std::cout << 900000000000001i64 + 4 * pow(10, 16) << endl;
std::cout << 900000000000002i64 + 4 * pow(10, 16) << endl;
std::cout << 900000000000003i64 + 4 * pow(10, 16) << endl;
std::cout << 900000000000004i64 + 4 * pow(10, 16) << endl;
std::cout << 900000000000005i64 + 4 * pow(10, 16) << endl;
std::cout << 900000000000006i64 + 4 * pow(10, 16) << endl;
std::cout << 900000000000007i64 + 4 * pow(10, 16) << endl;
std::cout << 900000000000008i64 + 4 * pow(10, 16) << endl;
std::cout << 900000000000009i64 + 4 * pow(10, 16) << endl;

将产生结果:

40900000000000000
40900000000000000
40900000000000000
40900000000000000
40900000000000008
40900000000000008
40900000000000008
40900000000000008
40900000000000008
40090000000000008

请注意这些值是如何四舍五入到 23 的。

关于c++ - 奇怪的 unsigned long long int 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35968967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com