自编cos(x)程序,利用麦克老林级数,请教差错
//我运行了以后,z竟然出现负数,cos值竟然有几千,我最怕数值益出的问题
// cos(x)=1-x^2/2!+x^4/4!-x^6/6!+...
#include "iostream.h "
#include <iomanip>
using namespace std;
double pow(double s,int m); //指数函数s^m原型
long factor(int n); //阶乘函数n!原型
void main()
{
float x;
printf( "please input x=? ");
scanf( "%f ",&x);
double y=1,z;
for(int i=1;;i++) //计数器
{
z=pow(x,2*i)/factor(2*i);//计算x^(2i)/(2i)!
if(i%2==0) //确定每项的正负号
y+=z;
else
y-=z;
if(z <=0.0000001) //根据交错收敛级数特性,确定精度
break;
}
printf( "z=%lf\n ",z);
printf( "the calculating result is cos(x)=%lf\n ",y);
}
double pow(double s,int m) //指数函数s^m
{
double t=s;
if(m==1)
return t;
else
{
for(int i=1;i <=m-1;i++)
s*=t;
return s;
}
}
long factor(int n) //阶乘函数n!
{
if(n==0)
return 1L;
else
return n*factor(n-1); //递归用法
}
[解决办法]
//long factor(int n)用int (long)计算阶乘, 很容易超过long的表示范围,
//因为是近似计算, 改用double吧.
#include <stdio.h>
#include <stdlib.h>
double pow(double s,int m); //指数函数s^m原型
double factor(double n); //阶乘函数n!原型
void main()
{
float x;
printf( "please input x=? ");
scanf( "%f ",&x);
double y=1,z;
for(int i=1;;i++) //计数器
{
z=pow(x,2*i)/factor(2*i);//计算x^(2i)/(2i)!
if(i%2==0) //确定每项的正负号
y+=z;
else
y-=z;
if(z <=0.0000001) //根据交错收敛级数特性,确定精度
break;
}
printf( "z=%lf\n ",z);
printf( "the calculating result is cos(x)=%lf\n ",y);
}
double pow(double s,int m) //指数函数s^m
{
double t=s;
if(m==1) return t;
else
{
for(int i=1;i <=m-1;i++)
s*=t;
return s;
}
}
[解决办法]
建议:x^n / n! = (x/1) * (x/2) * (x/3) *...*(x/n)
否则容易溢出