王鹿其 发表于 2023-12-24 22:21:14

为什么答案是错的

#include<iostream>
#include<iostream>
#include<cmath>
using namespace std;
double arctan(double x)
{
        int i = 1;
        double sum = 0;
        double fx = x;
        while (fx > 1e-15 || fx < -1e-15)
        {
                int base = 1;
               
                fx = base * pow(x, i) / i;
      sum += fx;
                base = -base;
                i = i + 2;

        }
        return sum;
}

int main()
{
        double b;
        double c;
        double a;
        b = 16 * arctan(1 / 5.0);
        c = 4 * arctan(1 / 239.0);
        a = b - c;

        cout << arctan(1) << endl;
        cout << a << endl;
}

FishC 发表于 2023-12-24 22:21:30

这段代码的问题在于,在头文件的包含部分有错误,应该是 `#include <iostream>` ,`#include <cmath>` 和 `#include <iomanip>`。另外,`using namespace std;` 可以放在头文件的包含后面。

此外,在计算 `b` 和 `c` 的时候,使用了整数除法,应该使用浮点数除法,可以将 `1` 改为 `1.0` 或 `1.0f`,如:`b = 16 * arctan(1.0 / 5.0);`。

最后,注意在 `main()` 函数中结束 `cout` 语句的写法,应该是 `cout << a;`。

以下是已经修正的代码:

#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;

double arctan(double x)
{
    int i = 1;
    double sum = 0;
    double fx = x;
    while (fx > 1e-15 || fx < -1e-15)
    {
      int base = 1;

      fx = base * pow(x, i) / i;
      sum += fx;
      base = -base;
      i = i + 2;
    }
    return sum;
}

int main()
{
    double b;
    double c;
    double a;

    b = 16 * arctan(1.0 / 5.0);
    c = 4 * arctan(1.0 / 239.0);
    a = b - c;

    cout << setprecision(16) << a;

    return 0;
}

请注意,我还在输出结果之前添加了 `setprecision(16)` 来设置输出的精度,以便更准确地显示小数位数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2023-12-24 22:49:03

本帖最后由 jackz007 于 2023-12-24 23:52 编辑

      while (fx > 1e-15 || fx < -1e-15)
      {
                int base = 1 ; // 不可以在循环体内定义这个变量 base, 因为,每次循环到这里,变量 base 都会被重新定义,其值都将被初始化为 1
      . . . . . .
                base = -base ; // 如果选择在循环体内定义变量 base,那么,这一句代码就会完全失效。


【版本1】:使用 pow() 函数
#include<iostream>
#include<cmath>

using namespace std                           ;

double arctan(double x)
{
      int i , base                        ;
      double d , sum                        ;
      for(i = base = 1 , sum = 0 ;; i += 2 , base = -base) {
                d = pow(x , i) / i            ;
                if(d > 1e-15) sum += base * d ;
                else break                  ;
      }
      return sum                            ;
}

int main()
{
      double a , b , c                      ;
      b = 16 * arctan(1 / 5.0)            ;
      c = 4 * arctan(1 / 239.0)             ;
      a = b - c                           ;
      cout << arctan(1) << endl             ;
      cout << a << endl                     ;
}

【版本2】:不使用 pow() 函数
#include<iostream>

using namespace std                           ;

double arctan(double x)
{
      int i , base                        ;
      double d , e , sum                  ;
      for(d = e = sum = x , base = -1 , i = 3 ;; i += 2 , base = -base) {
                e = e * x * x               ;// e = pow(x , i)
                d = e / i                     ;
                if(d > 1e-15) sum += base * d ;
                else break                  ;
      }
      return sum                            ;
}

int main()
{
      double a , b , c                      ;
      b = 16 * arctan(1 / 5.0)            ;
      c = 4 * arctan(1 / 239.0)             ;
      a = b - c                           ;
      cout << arctan(1) << endl             ;
      cout << a << endl                     ;
}
页: [1]
查看完整版本: 为什么答案是错的