鱼C论坛

 找回密码
 立即注册
查看: 4051|回复: 7

[已解决]c语言课后作业求助

[复制链接]
发表于 2021-6-5 10:12:01 | 显示全部楼层 |阅读模式
20鱼币
5^6 不是等于15625吗  c语言为什么显示15624呀       

#include <stdio.h>
#include <math.h>


int main()//计算:1^2 + 2^3 + 3^4 + 4^5 + 5^6 + 6^7 + 7^8 + 8^9
{
        int c,number1=1,number2=1,sum=0;

        for (number1=1;number1<=8;number1++)
        {
                number2++;
                 c=pow(number1, number2);
                sum+=c;
                printf("当前number1的值%d 当前number2的值%d 当前c的值%d\n",number1,number2,c);//5^6 =15625               
        }
        printf("当前sum的值%d ",sum);               
}

最佳答案
2021-6-5 10:12:02
本帖最后由 stein 于 2021-6-7 11:42 编辑

原因是pow()函数是double类型的,函数原型如下。
double pow(double x, double y)
你定义的变量是整形,在强制转换的时候就有可能出错,把5^6=15624.999999,强转成了15624。

你用VS2019,编译器会报错: warning C4244: “=”: 从“double”转换到“int”,可能丢失数据
意思就是函数是double类型,你传递的是int类型,就把0.999999....丢失了
你可以改成这样就不会错了。
#include <stdio.h>
#include <math.h>

int main()//计算:1^2 + 2^3 + 3^4 + 4^5 + 5^6 + 6^7 + 7^8 + 8^9
{
    double c, number1 = 1, number2 = 1, sum = 0;

    for (number1 = 1; number1 <= 8; number1++)
    {
        number2++;
        c = pow(number1, number2);
        sum += c;
        printf("当前number1的值%.0f 当前number2的值%.0f 当前c的值%.0f\n", number1, number2, c);//5^6 =15625               
    }
    printf("当前sum的值%.0f ", sum);
}
次方.png

最佳答案

查看完整内容

原因是pow()函数是double类型的,函数原型如下。 double pow(double x, double y) 你定义的变量是整形,在强制转换的时候就有可能出错,把5^6=15624.999999,强转成了15624。 你用VS2019,编译器会报错: warning C4244: “=”: 从“double”转换到“int”,可能丢失数据 意思就是函数是double类型,你传递的是int类型,就把0.999999....丢失了 你可以改成这样就不会错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 10:12:02 | 显示全部楼层    本楼为最佳答案   
本帖最后由 stein 于 2021-6-7 11:42 编辑

原因是pow()函数是double类型的,函数原型如下。
double pow(double x, double y)
你定义的变量是整形,在强制转换的时候就有可能出错,把5^6=15624.999999,强转成了15624。

你用VS2019,编译器会报错: warning C4244: “=”: 从“double”转换到“int”,可能丢失数据
意思就是函数是double类型,你传递的是int类型,就把0.999999....丢失了
你可以改成这样就不会错了。
#include <stdio.h>
#include <math.h>

int main()//计算:1^2 + 2^3 + 3^4 + 4^5 + 5^6 + 6^7 + 7^8 + 8^9
{
    double c, number1 = 1, number2 = 1, sum = 0;

    for (number1 = 1; number1 <= 8; number1++)
    {
        number2++;
        c = pow(number1, number2);
        sum += c;
        printf("当前number1的值%.0f 当前number2的值%.0f 当前c的值%.0f\n", number1, number2, c);//5^6 =15625               
    }
    printf("当前sum的值%.0f ", sum);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 12:09:15 | 显示全部楼层
你编译器的问题吧,我用DEVC++是15625
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 12:15:33 | 显示全部楼层
可能是编译器的问题,用别的软件试试吧

我的code::blocks跟你显示效果一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 12:18:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 12:25:21 | 显示全部楼层
本帖最后由 王之叹息 于 2021-6-5 12:40 编辑

https://blog.csdn.net/wuli_dear_ ... -baidujs-1.nonecase

https://blog.csdn.net/weixin_435 ... ~default-1.nonecase
搜出来好几个这种帖子
感觉说的还是很有道理的,并且你只要把pow函数求出的值放在float或double类型的变量进行存储就没误差了,在你的函数里就是把c定义成float或double类型就行了
毕竟pow本身就是个函数,只不过是现成写好的,就可能其中算法有点问题5^6求出来15624.999999转换成整形就是156724了

好吧,我也是有点迷,你如果不用变量,int a;然后直接a=pow(5,6)求出来的就是156725.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 12:46:46 | 显示全部楼层
运行这个代码看看
#include <stdio.h>
#include <math.h>


int main()//计算:1^2 + 2^3 + 3^4 + 4^5 + 5^6 + 6^7 + 7^8 + 8^9
{
        int c,number1=1,number2=1,sum=0;

        for (number1=1;number1<=8;number1++)
        {
                number2++;
                 c=pow(number1, number2);
                sum+=c;
                printf("当前number1的值%d 当前number2的值%d 当前c的值%d, cf: %lf\n",number1,number2,c, pow(number1, number2));//5^6 =15625               
        }
        printf("当前sum的值%d ",sum);               
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 18:38:11 | 显示全部楼层
用visual stdio
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 12:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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