为什么代码中pow函数用temp替换就可以
#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 类型时没有出现精度损失,结果就没有出错。 没看明白你的问题 xieglt 发表于 2020-10-21 10:26
没看明白你的问题
你复制编译试试,我不用temp直接用pow函数在表达式,输出结果就是0。用temp做中间变量,多一条语句,输出结果就对的 sunrise085 发表于 2020-10-21 10:36
这是强制格式转换惹的祸
首先你要知道pow函数的返回值是double类型
你直接写 sum=sum+pow(2,i); 计算的时 ...
不好意思,我的级别评分只能是一个,改成5,不给发出
我正想这么回答他,见你已经答了
页:
[1]