he843533019 发表于 2021-6-5 10:12:01

c语言课后作业求助

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);               
}

stein 发表于 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);
}

最强废铁h 发表于 2021-6-5 12:09:15

你编译器的问题吧,我用DEVC++是15625

肖-肖 发表于 2021-6-5 12:15:33

可能是编译器的问题,用别的软件试试吧

我的code::blocks跟你显示效果一样

万千只cnm 发表于 2021-6-5 12:18:16

{:5_103:}

王之叹息 发表于 2021-6-5 12:25:21

本帖最后由 王之叹息 于 2021-6-5 12:40 编辑

https://blog.csdn.net/wuli_dear_wang/article/details/80373255?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase

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

好吧,我也是有点迷,你如果不用变量,int a;然后直接a=pow(5,6)求出来的就是156725.

人造人 发表于 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);               
}

一生情缘 发表于 2021-6-5 18:38:11

用visual stdio
页: [1]
查看完整版本: c语言课后作业求助