首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

自编cos(x)程序,利用麦克老林级数,请问差错

2012-02-10 
自编cos(x)程序,利用麦克老林级数,请教差错//我运行了以后,z竟然出现负数,cos值竟然有几千,我最怕数值益出

自编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)
否则容易溢出

热点排行