函数计算结果错误答案

时间:2018-10-30 13:29:17

标签: c

我正在锻炼,并且坚持使用自己的代码。我希望你们能帮助我修复它。

enter image description here

这是我的函数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

2 个答案:

答案 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进行输出。但我认为printfC之间的代码并没有真正的区别。

此外,请记住,在此代码中,您很快达到了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

可以进行其他简化。

相关问题