鱼C论坛

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

[已解决]问题求助,课后作业

[复制链接]
发表于 2023-4-8 21:57:14 | 显示全部楼层 |阅读模式

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

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

x
请问有谁能帮忙解释一下这样写为什么不对吗?最后输出结果是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;
}
最佳答案
2023-4-8 22:21:38
抱歉,我之前的回答有误。当使用pow函数时,返回值类型确实为浮点数,并且对于整型变量直接复制可能会导致精度丢失或截断错误,因此需要进行类型转换。

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


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

  3. int main(){
  4.     int result;
  5.       
  6.     result = pow(1, 2) + pow(2, 3) + pow(3, 4) + pow(4, 5) + pow(5, 6);
  7.       
  8.     printf("%d", result);
  9.       
  10.     return 0;
  11. }
复制代码


输出结果为71727。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-8 21:59:14 | 显示全部楼层
这是因为 pow 函数的返回值类型是 double,但是你在格式化输出时用了 %ld 的格式化字符串,这是用来输出 long 类型的整数的。因此,你需要使用 %f 格式化字符串来输出 double 类型的浮点数。
有用请设置最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

  3. int main(){
  4.       
  5.         printf("%f",pow(1,2)+pow(2,3)+pow(3,4)+pow(4,5)+pow(5,6));
  6.       
  7.         return 0;
  8. }
复制代码


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

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

  3. int main(){
  4.       
  5.         printf("%ld",lround(pow(1,2)+pow(2,3)+pow(3,4)+pow(4,5)+pow(5,6)));
  6.       
  7.         return 0;
  8. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

下面是修改后的代码:


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

  3. int main(){
  4.       
  5.         printf("%f",pow(1,2)+pow(2,3)+pow(3,4)+pow(4,5)+pow(5,6));
  6.       
  7.         return 0;
  8. }
复制代码


输出结果为`117649.000000`,正确反映了计算结果。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2023-4-8 22:21:38 | 显示全部楼层    本楼为最佳答案   
抱歉,我之前的回答有误。当使用pow函数时,返回值类型确实为浮点数,并且对于整型变量直接复制可能会导致精度丢失或截断错误,因此需要进行类型转换。

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


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

  3. int main(){
  4.     int result;
  5.       
  6.     result = pow(1, 2) + pow(2, 3) + pow(3, 4) + pow(4, 5) + pow(5, 6);
  7.       
  8.     printf("%d", result);
  9.       
  10.     return 0;
  11. }
复制代码


输出结果为71727。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

然而,pow()函 ...

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

使用道具 举报

发表于 2023-4-8 22:26:06 | 显示全部楼层
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 10:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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