纠错。问题:求 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);
…………………………………………完美分割线…………………………………………
感谢啄木鸟纠错,谢谢谢谢。
我这边的执行结果就是16739 你这个没问题, 答案是对的
#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: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 代码是对的 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); 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.
$ 亲~如果问题已解决,别忘了设置最佳答案!{:5_92:} 本帖最后由 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 本身存在隐患,估计楼主的问题也同样是出在编译器上。 jackz007 发表于 2022-8-26 13:57
编译器是 tdm-gcc
楼主的代码用 VC 6.0 编译后的运行结果也是正确的,可能是 tdm-g ...
嗯,我感觉也是编译器的问题
jackz007 发表于 2022-8-26 13:57
编译器是 tdm-gcc
楼主的代码用 VC 6.0 编译后的运行结果也是正确的,可能是 tdm-g ...
确实,我用tdm-gcc也出现了同样的问题 非常感谢各位啄木鸟的回答,谢谢谢谢{:5_110:} 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 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() 函数而来,这就是两个结果存在差异的根本原因。 jackz007 发表于 2022-8-26 19:35
看来,问题就出在当 pow() 的两个参数是常数和变量时的计算结果存在着差异:
编译、 ...
哇瑟,太感谢你啦,虽然有些还看不懂,但大概明白啦,请接受小白的摩拜{:5_110:} 偶数幂级数得结果必然是偶数
奇数幂级数得结果必然是奇数
3奇数 + 2偶数 = 奇数
页:
[1]