鱼C论坛

 找回密码
 立即注册
查看: 1516|回复: 13

[已解决]萌新求助

[复制链接]
发表于 2020-8-26 18:33:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        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,按上面的写的打印结果正常.
最佳答案
2020-8-26 18:56:08
数据类型用 double 型,输出采用科学记数法,两个输出是一样的。否则会因为数据类型导致数据丢失

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-26 18:42:54 | 显示全部楼层
本帖最后由 昨非 于 2020-8-26 18:48 编辑

没。。没区别吧
而且,你确定C语言能算了这么大的数??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-26 18:56:08 | 显示全部楼层    本楼为最佳答案   
数据类型用 double 型,输出采用科学记数法,两个输出是一样的。否则会因为数据类型导致数据丢失
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-26 19:02:37 | 显示全部楼层
第二段改成
        for (i=0; i < 64; i++)
        {
                sum = sum + (unsigned long long)pow(2, i);
        }
就可以正常运行了。

具体原因我也不是很清楚,但是和浮点数有关。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-26 19:05:34 | 显示全部楼层
对了,如果要计算2的n次方的话,建议你使用这个宏:
#define pow2(x) ((unsigned long long)(1) << (x))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-26 19:16:18 | 显示全部楼层
#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);
}

jg.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-27 13:17:00 | 显示全部楼层

我是在课后习题时候发现这个问题的,按小甲鱼的代码运行可以正确运行,吧其中的循环部分合并起来就不行了


#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-27 13:19:19 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-26 19:02
第二段改成就可以正常运行了。

具体原因我也不是很清楚,但是和浮点数有关。

这样改果然可以.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-27 13:21:19 | 显示全部楼层
昨非 发表于 2020-8-26 18:42
没。。没区别吧
而且,你确定C语言能算了这么大的数??

课后习题...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-27 13:26:24 | 显示全部楼层
风过无痕1989 发表于 2020-8-26 18:56
数据类型用 double 型,输出采用科学记数法,两个输出是一样的。否则会因为数据类型导致数据丢失
因为数据类型导致数据丢失
???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-27 13:26:28 From FishC Mobile | 显示全部楼层
好吧,打扰了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-27 15:32:18 | 显示全部楼层

我用 float 型,在步进计算到 i = 45 时,就溢出了,这个时候的 sum = 0。我用的是VC++6.0,你可以试试的你的编译器,计算到哪一步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-27 15:42:41 | 显示全部楼层
风过无痕1989 发表于 2020-8-27 15:32
我用 float 型,在步进计算到 i = 45 时,就溢出了,这个时候的 sum = 0。我用的是VC++6.0,你可以试试的 ...

这和这个问题有关系么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-27 18:30:05 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-27 15:42
这和这个问题有关系么?

他的程序本来是没有问题,只是因为使用数据类型不对,在强行进行数据转换时出错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 07:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表