飞飛飞 发表于 2023-4-8 21:57:14

问题求助,课后作业

请问有谁能帮忙解释一下这样写为什么不对吗?最后输出结果是0,如果把%ld换成%f就是正确结果,为什么啊?感谢解答!!!
#include <stdio.h>
#include <math.h>

int main(){
       
        printf("%ld",pow(1,2)+pow(2,3)+pow(3,4)+pow(4,5)+pow(5,6));
       
        return 0;
}

liuhongrun2022 发表于 2023-4-8 21:59:14

这是因为 pow 函数的返回值类型是 double,但是你在格式化输出时用了 %ld 的格式化字符串,这是用来输出 long 类型的整数的。因此,你需要使用 %f 格式化字符串来输出 double 类型的浮点数。
有用请设置最佳答案!

isdkz 发表于 2023-4-8 21:59:23

问题出在printf的格式说明符上。在您的代码中,您使用了%ld,它表示长整型(long int)。

然而,pow()函数返回的是一个双精度浮点数(double),所以您应该使用%f来输出正确的结果。

当您使用错误的格式说明符时,输出的结果可能是未定义的或不正确的。下面是修改后的代码:

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

int main(){
      
      printf("%f",pow(1,2)+pow(2,3)+pow(3,4)+pow(4,5)+pow(5,6));
      
      return 0;
}


这将输出正确的结果。如果您想要一个整数结果,您可以使用round()函数将结果四舍五入到最接近的整数,并使用%ld进行输出。这是相应的修改:

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

int main(){
      
      printf("%ld",lround(pow(1,2)+pow(2,3)+pow(3,4)+pow(4,5)+pow(5,6)));
      
      return 0;
}

sfqxx 发表于 2023-4-8 22:01:28

这段代码中,输出格式符`%ld`表示输出的是long int类型的整数,而`pow()`函数的返回值类型是double型浮点数。因此,当使用`%ld`格式符时,会导致截断该double型数据,而只取其整数部分,最终结果得到的是0。

如果将`%ld`改为`%f,则可以正确地输出浮点型结果。

下面是修改后的代码:


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

int main(){
      
      printf("%f",pow(1,2)+pow(2,3)+pow(3,4)+pow(4,5)+pow(5,6));
      
      return 0;
}


输出结果为`117649.000000`,正确反映了计算结果。
有用请设置最佳答案

飞飛飞 发表于 2023-4-8 22:18:14

sfqxx 发表于 2023-4-8 22:01
这段代码中,输出格式符`%ld`表示输出的是long int类型的整数,而`pow()`函数的返回值类型是double型浮点数 ...

您不是说截断后取整数部分吗?那为什么不是输出整数部分,而是0?
还有就是pow返回值类型是浮点数,为什么能让整形变量等于它的返回值
#include <stdio.h>
#include <math.h>

int main(){
       
        int result;
       
        result=pow(1,2)+pow(2,3)+pow(3,4)+pow(4,5)+pow(5,6);
       
        printf("%d",result);
       
        return 0;
}

sfqxx 发表于 2023-4-8 22:21:38

抱歉,我之前的回答有误。当使用pow函数时,返回值类型确实为浮点数,并且对于整型变量直接复制可能会导致精度丢失或截断错误,因此需要进行类型转换。

另外,在这个程序中,将1, 2, 3, 4和5的不同次幂相加,然后将结果赋给整数变量result。由于这些幂是整数,所以pow函数的返回值也应该是整数。因此,正确的代码如下:


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

int main(){
    int result;
      
    result = pow(1, 2) + pow(2, 3) + pow(3, 4) + pow(4, 5) + pow(5, 6);
      
    printf("%d", result);
      
    return 0;
}


输出结果为71727。

isdkz 发表于 2023-4-8 22:23:20

isdkz 发表于 2023-4-8 21:59
问题出在printf的格式说明符上。在您的代码中,您使用了%ld,它表示长整型(long int)。

然而,pow()函 ...

看这里

sfqxx 发表于 2023-4-8 22:26:06

有用请设置最佳答案
页: [1]
查看完整版本: 问题求助,课后作业