我想直接求PI值,但PI=0,想求大佬找一下错。

#include
using namespace std;
double power(double x,int n){
double val=1.0;
while(n--)
val*=x;
return val;
}

double arctan (double x){
int sum;
for (int i=1,z=2 ; i<=15 ; i+=2,z++){
if(z%2!=0)
{sum=((-(int)power(x,i))/i);
}
else
{sum=((int)power(x,i))/i;
}
sum+=sum;
}
return sum;
}
int main(){
double PI;
double a=16*(double)arctan(1/5.0);
double b=(double)4*arctan(1/239.0);
PI=a-b;
cout<<"PI= "<<PI<<endl;
return 0;
}

C++中math库包含求解次冥 和 反正切 的函数
1.pow(x,n)即你写的power
2.atan(x)即你写的arctan

修改使用库函数后,结果正常,判断下来,应该是反正切arctan中出了问题,建议多加点输出cout仔细查一查逻辑。

#include<iostream>
#include<math.h>
using namespace std;
//double power(double x,int n){
//double val=1.0;
//while(n--)
//val*=x;
//return val;
//}

//double arctan (double x){
//int sum;
//for (int i=1,z=2 ; i<=15 ; i+=2,z++){
//  if(z%2!=0)
//      {sum=((-(int)pow(x,i))/i);
//      }
//  else
//  {sum=((int)pow(x,i))/i;
//  }
//sum+=sum;
//}
//return sum;
//}

int main(){
    double PI;
    double a=16*(double)atan(1/5.0);
    double b=(double)4*atan(1/239.0);
    cout<<a<<b<<endl;
    PI=a-b;
    cout<<"PI= "<<PI<<endl;
    return 0;
}

运行结果

double arctan (double x)
{
    const int N_MAX = 1024;
    double sum = 0;              
    // 不要忘记初始化变量; 展开式的每一项的结果是小数,因此sum应定义为double类型
    for (int sign = 1, m = 1; m <= N_MAX * 2 + 1; m += 2)
    {   
        double item = power(x, m) / m;
        if (sign == 1)
        {
            sum += item;
            sign = -1;
        }
        else {
            sum -= item;
            sign = 1;
        }
    }
    return sum;
}