萌新求助
for (i=0; i < 64; i++){
temp = pow(2, i);
sum = sum + temp;
}
------------------------------------------------
for (i=0; i < 64; i++)
{
sum = sum + pow(2, i);
}
请问这两段代码有什么区别,为什么按下面的写,打印出来的结果是0,按上面的写的打印结果正常.
{:10_266:} 本帖最后由 昨非 于 2020-8-26 18:48 编辑
没。。没区别吧{:10_245:}
而且,你确定C语言能算了这么大的数?? 数据类型用 double 型,输出采用科学记数法,两个输出是一样的。否则会因为数据类型导致数据丢失 第二段改成 for (i=0; i < 64; i++)
{
sum = sum + (unsigned long long)pow(2, i);
}就可以正常运行了。
具体原因我也不是很清楚,但是和浮点数有关。 对了,如果要计算2的n次方的话,建议你使用这个宏:#define pow2(x) ((unsigned long long)(1) << (x)) #include <stdio.h>
#include <math.h>
int main(void)
{
double sum = 0,temp = 0;
int i;
for (i = 0;i < 64;i++)
{
temp = pow(2,i);
sum = sum + temp;
/* sum = sum + pow(2,i); */
}
printf("%e\n",sum);
}
风过无痕1989 发表于 2020-8-26 19:16
我是在课后习题时候发现这个问题的,按小甲鱼的代码运行可以正确运行,吧其中的循环部分合并起来就不行了
#include <stdio.h>
#include <math.h>
int main()
{
unsigned long long sum = 0;
unsigned long long temp;
unsigned long long weight;
int i;
for (i=0; i < 64; i++)
{
//temp = pow(2, i);
//sum = sum + temp;
sum = sum+ pow(2, i); //这里改成这样就不行
}
weight = sum / 25000;
printf("舍罕王应该给予达依尔%e粒麦子!\n", sum);//这里按你的%e也不行
printf("如果每25000粒麦子为1kg,那么应该给%llu公斤麦子!\n", weight);
return 0;
} 永恒的蓝色梦想 发表于 2020-8-26 19:02
第二段改成就可以正常运行了。
具体原因我也不是很清楚,但是和浮点数有关。
这样改果然可以.{:10_254:} 昨非 发表于 2020-8-26 18:42
没。。没区别吧
而且,你确定C语言能算了这么大的数??
课后习题...{:10_254:} 风过无痕1989 发表于 2020-8-26 18:56
数据类型用 double 型,输出采用科学记数法,两个输出是一样的。否则会因为数据类型导致数据丢失
因为数据类型导致数据丢失??? 好吧,打扰了
永恒的蓝色梦想 发表于 2020-8-27 13:26
???
我用 float 型,在步进计算到 i = 45 时,就溢出了,这个时候的 sum = 0。我用的是VC++6.0,你可以试试的你的编译器,计算到哪一步 风过无痕1989 发表于 2020-8-27 15:32
我用 float 型,在步进计算到 i = 45 时,就溢出了,这个时候的 sum = 0。我用的是VC++6.0,你可以试试的 ...
这和这个问题有关系么? 永恒的蓝色梦想 发表于 2020-8-27 15:42
这和这个问题有关系么?
他的程序本来是没有问题,只是因为使用数据类型不对,在强行进行数据转换时出错了
页:
[1]