|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
求教大佬,小甲鱼指出最后得出的答案因为数据存放限制所以不是准确答案,请问可以这样写吗?
int main()
{
int a;
double b;
double c;
double sum = 0;
for(a=0;a<64;a++)
{
b = pow(2,a);
sum = sum + b;
}
c = sum/25000;
printf("总共%.0f颗麦子\n",sum);
printf("总共%.3f公斤麦子\n",c);
return 0;
}
运行结果如图,但是我还是觉得不正确,既然第一格是1颗,总颗数的结果应该末位是1或者是个单数吧,求教大佬是什么原因,或者错在哪里,谢谢大佬~~
double运算的时候数据太大会有精度损失,只有15位有效位数,数据再长就有误差了。
这里应该用unsigned long long ,用这个类型的时候,就不要用pow函数了,因为这个函数的返回值是double,也可能会产生精度误差
- #include<stdio.h>
- #include<math.h>
- int main()
- {
- unsigned long long a;
- unsigned long long b=1;
- unsigned long long c;
- unsigned long long sum = 0;
- for(a=0;a<64;a++)
- {
- //b = pow(2,a);//用pow函数仍然可能会有精度问题,因为pow返回值是double类型建议直接每次循环乘以2
- sum = sum + b;
- b *= 2;
- }
-
- c = sum/25000;
- printf("总共%llu颗麦子\n",sum);
- printf("总共%llu公斤麦子\n",c);
- return 0;
- }
复制代码
|
|