#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;
}