开心多巴胺 发表于 2022-8-26 12:02:36

纠错。问题:求 1^2 + 2^3 + 3^4 + 4^5 + 5^6 的值?为啥我写的比正确答案少1?谢谢

实际答案是16739.一下是我的中间代码,答案得到的是16738.哪里出错了呀?
…………………………………………完美分割线…………………………………………
      int i,temp;
        int sum=0;
        for(i=1;i<=5;i++)
        {
                temp=pow(i,i+1);
                sum+=temp;
        }
        printf("1^2+2^3+3^4+4^5+5^6=%d\n",sum);

…………………………………………完美分割线…………………………………………

感谢啄木鸟纠错,谢谢谢谢。


临时号 发表于 2022-8-26 12:12:09

我这边的执行结果就是16739

柿子饼同学 发表于 2022-8-26 12:16:20

你这个没问题, 答案是对的
#include <bits/stdc++.h>
using namespace std;

int main(){
        int sum = 0;

        for(int i = 1; i <= 5; i++){
                sum += pow(i, i + 1);
        }

        printf("%d", sum);
       
        return 0;
}

jackz007 发表于 2022-8-26 12:39:09

本帖最后由 jackz007 于 2022-8-26 12:54 编辑

      问题出在 pow(5 , 6) = 15624,显然是错误的,正确值是 5 ^ 6 = 15625,整型数运算,最好避免用 pow()。
#include <stdio.h>

int main(void)
{
      int d , i , j , n                              ;
      for(n = 0 , i = 1 ; i < 6 ; i ++) {
                for(d = i , j = 0 ; j < i ; j ++) d *= i ;
                n += d                                 ;
      }
      printf("%d\n" , n)                               ;
}
      显然,正确答案是16739

竹逸 发表于 2022-8-26 12:39:35

代码是对的

aaron0919 发表于 2022-8-26 13:45:19

int i,temp;
int sum=0;
for(i=1;i<=5;i++)
{
       temp=int(pow(i,i+1));
       sum+=temp;
}printf("1^2+2^3+3^4+4^5+5^6=%d\n",sum);

人造人 发表于 2022-8-26 13:50:12

jackz007 发表于 2022-8-26 12:39
问题出在 pow(5 , 6) = 15624,显然是错误的,正确值是 5 ^ 6 = 15625,整型数运算,最好避免用 po ...

pow(5 , 6) = 15624 是在哪个编译器上出现的?这是编译器的bug吗?
新版本的gcc,pow(5 , 6) = 15625
$ cat main.c
#include <stdio.h>
#include <math.h>

int main(void) {
    int x = pow(5, 6);
    printf("%d\n", x);
    printf("%f\n", pow(5, 6));
    return 0;
}
$ gcc -g -Wall -o main main.c
$ ./main
15625
15625.000000
$ gcc --version
gcc (GCC) 12.1.1 20220730
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$

aaron0919 发表于 2022-8-26 13:52:36

亲~如果问题已解决,别忘了设置最佳答案!{:5_92:}

jackz007 发表于 2022-8-26 13:57:59

本帖最后由 jackz007 于 2022-8-26 14:04 编辑

人造人 发表于 2022-8-26 13:50
pow(5 , 6) = 15624 是在哪个编译器上出现的?这是编译器的bug吗?
新版本的gcc,pow(5 , 6) = 15625

      编译器是 tdm-gcc
D:\\C>gcc --version
gcc (tdm-1) 5.1.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


D:\\C>
      楼主的代码用 VC 6.0 编译后的运行结果也是正确的,可能是 tdm-gcc 本身存在隐患,估计楼主的问题也同样是出在编译器上。

人造人 发表于 2022-8-26 14:06:30

jackz007 发表于 2022-8-26 13:57
编译器是 tdm-gcc

      楼主的代码用 VC 6.0 编译后的运行结果也是正确的,可能是 tdm-g ...

嗯,我感觉也是编译器的问题

临时号 发表于 2022-8-26 14:12:13

jackz007 发表于 2022-8-26 13:57
编译器是 tdm-gcc

      楼主的代码用 VC 6.0 编译后的运行结果也是正确的,可能是 tdm-g ...

确实,我用tdm-gcc也出现了同样的问题

开心多巴胺 发表于 2022-8-26 17:30:59

非常感谢各位啄木鸟的回答,谢谢谢谢{:5_110:}

开心多巴胺 发表于 2022-8-26 17:37:28

jackz007 发表于 2022-8-26 13:57
编译器是 tdm-gcc

      楼主的代码用 VC 6.0 编译后的运行结果也是正确的,可能是 tdm-g ...

感谢您的回答,我初学还有点不懂,我在同一个文件编写以下参考代码,编译运行的结果又是16739呢?
……………………………完美分割线……………………………………………
      int result;

        result=pow(1,2)+pow(2,3)+pow(3,4)+pow(4,5)+pow(5,6);

        printf("结果是:%d",result);

……………………………完美分割线……………………………………………

jackz007 发表于 2022-8-26 19:35:32

本帖最后由 jackz007 于 2022-8-26 20:36 编辑

开心多巴胺 发表于 2022-8-26 17:37
感谢您的回答,我初学还有点不懂,我在同一个文件编写以下参考代码,编译运行的结果又是16739呢?
…… ...

       看来,问题就出在当 pow() 的两个参数是常数和变量时的计算结果存在着差异:
#include <stdio.h>
#include <math.h>

int main(void)
{
      int i = 5 , j = 6                              ;
      printf("pow(5 , 6) = %d\n" , (int) pow(5 , 6)) ;
      printf("pow(i , j) = %d\n" , (int) pow(i , j)) ;
}
      编译、运行实况:
D:\\C>g++ -o x x.c

D:\\C>x
pow(5 , 6) = 15625
pow(i , j) = 15624

D:\\C>
      下面,通过反汇编研究一下原因:
00401350/$55                         push    ebp
00401351|.89E5                     mov   ebp, esp
00401353|.83E4 F0                  and   esp, FFFFFFF0
00401356|.83EC 30                  sub   esp, 30
00401359|.E8 22060000                call    00401980
0040135E|.C74424 2C 05000000         mov   dword ptr , 5                     <--- i = 5
00401366|.C74424 28 06000000         mov   dword ptr , 6                     <--- j = 6
0040136E|.C74424 04 093D0000         mov   dword ptr , 3D09                   <--- pow(5 , 6) 的计算结果 0x3D09 = 15625
00401376|.C70424 24304000            mov   dword ptr , 00403024                ;ASCII "pow(5 , 6) = %d
"
0040137D|?E8 6E080000                call    <jmp.&msvcrt.printf>                      <--- printf()
00401382|?DB4424 28                  fild    dword ptr
00401386|?DB4424 2C                  fild    dword ptr
0040138A|?D9C9                     fxch    st(1)
0040138C|.DD5C24 08                  fstp    qword ptr                         ; |
00401390|.DD1C24                     fstp    qword ptr                         ; |
00401393|?E8 60080000                call    <jmp.&msvcrt.pow>
00401398|?D97C24 1E                  fstcw   word ptr
0040139C|.0FB74424 1E                movzx   eax, word ptr                    ; |
004013A1|?B4 0C                      mov   ah, 0C
004013A3|?66:894424 1C               mov   word ptr , ax
004013A8|.D96C24 1C                  fldcw   word ptr                         ; |
004013AC|.DB5C24 18                  fistp   dword ptr                      ; |
004013B0|.D96C24 1E                  fldcw   word ptr                         ; |
004013B4|.8B4424 18                  mov   eax, dword ptr                   ; |
004013B8|.894424 04                  mov   dword ptr , eax                   ; <--- 要显示的 pow(i , j) = 0x3D08 = 15624
004013BC|?C70424 35304000            mov   dword ptr , 00403035                ;ASCII "pow(i , j) = %d
"
004013C3|?E8 28080000                call    <jmp.&msvcrt.printf>                     <--- printf()
004013C8|?B8 00000000                mov   eax, 0
004013CD   ?C9                         leave
004013CE   .C3                         retn
004013CF   ?90                         nop
       通过反汇编发现,pow(5 , 6) 的计算结果 15625 并非实际调用 pow() 计算而来,而是以一个常数的形式存在于可执行代码中,显然,这是编译器在编译代码的时候计算出了这个结果;而 pow(i , j) 的计算结果 15624 则是通过调用 pow() 函数而来,这就是两个结果存在差异的根本原因。

开心多巴胺 发表于 2022-8-26 21:10:24

jackz007 发表于 2022-8-26 19:35
看来,问题就出在当 pow() 的两个参数是常数和变量时的计算结果存在着差异:

      编译、 ...

哇瑟,太感谢你啦,虽然有些还看不懂,但大概明白啦,请接受小白的摩拜{:5_110:}

傻眼貓咪 发表于 2022-8-27 15:47:12

偶数幂级数得结果必然是偶数
奇数幂级数得结果必然是奇数
3奇数 + 2偶数 = 奇数
页: [1]
查看完整版本: 纠错。问题:求 1^2 + 2^3 + 3^4 + 4^5 + 5^6 的值?为啥我写的比正确答案少1?谢谢