|
|
2鱼币
- #include <stdio.h>
- #include <math.h>
- int main()
- {
- int i;
- unsigned long long sum=0;
- unsigned long long weight;
- //unsigned long long temp;
- for (i=0;i<64;i++)
- {
- //temp = pow(2,i);
- sum=sum+pow(2,i);
-
- }
- weight=sum/25000;
- printf("含罕王应该给予达依尔%llu粒麦子\n",sum);
- printf("含罕王应该给予达依尔%llukg麦子,每千克麦子25000粒\n",weight);
- return 0;
- }
复制代码
这是强制格式转换惹的祸
首先你要知道pow函数的返回值是double类型
你直接写 sum=sum+pow(2,i); 计算的时候会先把右边的都转为double类型进行计算,然后再讲计算结果转为unsigned long long 类型。这样就导致在类型转换的时候有精度损失,最后得到的实际上应该是2^64-1,但是由于精度损失问题,最后数据变成了2^64,而 unsigned long long 类型的最大值是 2^64-1,这个值溢出了,就变成了0。
若用temp中转,temp不会这么大,要少一位,pow的返回值转为 unsigned long long 类型时没有出现精度损失,结果就没有出错。
|
|