gpt4 book ai didi

c - 17位或更多位 double

转载 作者:行者123 更新时间:2023-11-30 15:31:27 24 4
gpt4 key购买 nike

将大 double (17 位以上)转换为整数时出现精度损失。

#include <stdio.h>

int main() {
int n = 20;
double acum = 1;
while (n--) acum *= 9;
printf("%.0f\n", acum);
printf("%llu\n", (unsigned long long)acum);
return 0;
}

这段代码的输出是:

12157665459056929000
12157665459056928768

我不能使用 unsigned long long 进行计算,因为这只是一个伪代码,我需要真实代码的精度,其中包含除法。

如果我增加小数位数,第一个输出就会变成,例如 12157665459056929000.0000000000。我尝试过 round(acum) 和 trunc(acum) ,在这两种情况下,结果都与第二个输出相同。它们不应该等于第一个吗?

我知道 float 只有 6 位小数精度,而 double 大约有 17 位小数。但是数字有什么问题?!?

最佳答案

实际上,当我将 acum 的类型更改为 unsigned long long 时,例如:

无符号长长 acum = 1;

结果是:

12157665459056928801

当我使用Python计算准确答案时:

>>9**20
12157665459056928801L

你看到了吗?

12157665459056929000 根本不是准确答案,实际上是准确答案的近似值。

然后我像这样更改代码:

printf("%llu\n", (unsigned long long)1.2157665459056929e+019);

printf("%llu\n", (unsigned long long)1.2157665459056928e+019);

printf("%llu\n", (unsigned long long)1.2157665459056927e+019);

printf("%llu\n", (unsigned long long)1.2157665459056926e+019);

结果是:

12157665459056928768

12157665459056928768

12157665459056926720

12157665459056926720

实际上19位已经超出了cpp的位数限制,这么大的数字转换的结果是不可预期的且不安全的。

关于c - 17位或更多位 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24793256/

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