鱼C论坛

 找回密码
 立即注册
查看: 1352|回复: 15

[已解决]零基础小白求教S1E6课后麦子题~

[复制链接]
发表于 2020-10-29 02:13:49 | 显示全部楼层 |阅读模式

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

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

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或者是个单数吧,求教大佬是什么原因,或者错在哪里,谢谢大佬~~
最佳答案
2020-10-29 09:36:29
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;
}
M81S249}E~16MACK3HU]1DL.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-29 08:18:36 | 显示全部楼层
系统精度问题,正确的这个数应该是:1844 6744 0737 0955 1615
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 08:30:07 | 显示全部楼层
改用long double试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 09:01:55 | 显示全部楼层

没有 long double 这种类型 !
使用 unsigned long long 型,DEV 运行后数值出错(太小),具体不知是我的系统问题,还是所有的DEV都是这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 09:36:29 | 显示全部楼层    本楼为最佳答案   
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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 13:37:18 | 显示全部楼层
sunrise085 发表于 2020-10-29 09:36
double运算的时候数据太大会有精度损失,只有15位有效位数,数据再长就有误差了。
这里应该用unsigned lon ...


你的程序运行结果是 4294967295,数值还是太小
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 14:21:19 | 显示全部楼层
风过无痕1989 发表于 2020-10-29 13:37
你的程序运行结果是 4294967295,数值还是太小

?????
运行结果正常啊
总共18446744073709551615颗麦子
总共737869762948382公斤麦子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-29 14:37:46 | 显示全部楼层
风过无痕1989 发表于 2020-10-29 08:18
系统精度问题,正确的这个数应该是:1844 6744 0737 0955 1615

如图,小甲鱼老师说不是准确的,而且我也算过,这个正好是long long 的最大值,并不是麦子的颗数吧?
S$N6TMH6POBF%W8B}TYK@%X.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-29 14:39:44 | 显示全部楼层
sunrise085 发表于 2020-10-29 14:21
?????
运行结果正常啊

如图,小甲鱼老师说不是准确的,而且我也算过,这个正好是long long 的最大值,并不是麦子的颗数吧?
S$N6TMH6POBF%W8B}TYK@%X.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 16:15:02 | 显示全部楼层
本帖最后由 sunrise085 于 2020-10-29 16:17 编辑
q789423 发表于 2020-10-29 14:39
如图,小甲鱼老师说不是准确的,而且我也算过,这个正好是long long 的最大值,并不是麦子的颗数吧?


小甲鱼说的不对哟。
unsigned long long的最大值的确是18446744073709551615
这个值是2^64-1
但是这个运算的结果是多少?你知道么?
2^0+2^1+2^2+……+2^63=2^64-1
这不就是这个结果么?
程序添加一行,打印每次循环的结果,你自己看看,有哪一步计算溢出么?
#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;
        printf("b=%llu,sum=%llu\n",b,sum);
        b *= 2;
    }
    
    c = sum/25000;
    printf("总共%llu颗麦子\n",sum);
    printf("总共%llu公斤麦子\n",c);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-29 17:25:24 | 显示全部楼层
sunrise085 发表于 2020-10-29 16:15
小甲鱼说的不对哟。
unsigned long long的最大值的确是18446744073709551615
这个值是2^64-1

理解了,谢谢大佬,非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 18:16:14 | 显示全部楼层
sunrise085 发表于 2020-10-29 16:15
小甲鱼说的不对哟。
unsigned long long的最大值的确是18446744073709551615
这个值是2^64-1

其实,这个题我做了很多次,都是因为32系统输出的结果太小,一直不敢吭声。

晚上,我安装一个win10,再安装一个VS2019,再来运行看看,到底输出是多少
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-29 18:43:47 | 显示全部楼层
风过无痕1989 发表于 2020-10-29 18:16
其实,这个题我做了很多次,都是因为32系统输出的结果太小,一直不敢吭声。

晚上,我安装一个win10, ...

大佬辛苦了,非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 22:31:42 | 显示全部楼层
q789423 发表于 2020-10-29 18:43
大佬辛苦了,非常感谢

刚安装完成,一个VS2015都搞2个多小时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 23:45:30 | 显示全部楼层
BV2015 装了我几个小时了,还没安装完
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-30 01:49:04 | 显示全部楼层
风过无痕1989 发表于 2020-10-29 23:45
BV2015 装了我几个小时了,还没安装完

不好意思啊大佬,为了这么一个小问题,不用这么破费的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 18:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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