我正在锻炼,并且坚持使用自己的代码。我希望你们能帮助我修复它。
这是我的函数fen()
:
double fen(double x,double y, int n) { // You should complete this function
// Write your statements here
double sum=1,temp;
int j=2,k=1;
double a = (x*y*y) / 18;
sum=1-a;
for(int i=2;i<=n;i++)
{
for(;j<=i;j++)
{
a *= (x*y);
for(;k<=(i+j);k++)
a /= k;
}
temp = a/(k*k);
temp = (i%2 == 0) ? temp : -temp;
sum+=temp;
}
return sum; //This statement must be changed
}
我已经检查了很多次,但仍然不知道为什么它的结果是错误的。
我进行了调试,当i=3
时,实际上等于0.025
,但显示为0.02499999999
。
答案 0 :(得分:1)
我写了一个小代码来简化事情,这里是:
#include <iostream>
using namespace std;
double fen(double x,double y, int n) {
double tmp = y;
double sum = 1;
for (int i = 1; i < n; i++) {
tmp *= -((x * y * (2*i-1)) / ((2*i) * (2*i+1) * (2*i+1)));
sum += tmp;
}
return sum;
}
int main(void) {
cout << fen(2,3,1) << endl;
cout << fen(2,3,2) << endl;
cout << fen(2,3,3) << endl;
cout << fen(2,3,4) << endl;
cout << fen(2,3,1000) << endl;
return 0;
}
我只检查到fen(2,3,4)
为止,结果一直正确无误。它显示0.162772
的{{1}}:
fen(2,3,1000)
更新:
更新了代码,以使用1
0
0.18
0.161633
0.162772
而不是cout
进行输出。但我认为printf
或C
之间的代码并没有真正的区别。
此外,请记住,在此代码中,您很快达到了C++
的数值精度极限。
答案 1 :(得分:0)
OP的公式错误地计算了术语。
// int j=2,k=1;
int j=2,k=3; // The loop's later calculation expect this to be initially 3
// in the loop
// add
a *= k; // undo the prior terms /k
for(;j<=i;j++) {
// this part OK
}
// temp = a/(k*k);
temp = a/k*; // Only need /k
可以进行其他简化。