| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 300 人关注过本帖
标题:急!!做STITP 编程遇到问题 求高手解释下
只看楼主 加入收藏
枫逸红雨
Rank: 1
来 自:南京
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-3-30
收藏
 问题点数:0 回复次数:0 
急!!做STITP 编程遇到问题 求高手解释下
由于用C51编程 没有sin cos asin这类库函数 就自己用麦克劳林展开编了个程序
但是运行的时候后有些值不精确 劳烦看一下下面的程序

--------------------------------------------------
#include "stdio.h"
#define pi 3.14159265358979323846
--------------------------------------------阶乘n!
extern unsigned long jiec(int m)
{   int i,s=1;
    if(m<=0) s=1;
    else
    for(i=1;i<=m;i++) s=s*i;
    return(s);
}
----------------------------------------二级阶乘n!!
extern unsigned long jiecc(int m)
{   
    int i,s=1;
    if(m<=0) s=1;
    else
    {
      for(i=m;i>=0;i=i-2)
       {
        if(i==0) s=s*1;
        else s=s*i;
        }
    }
    return(s);
}
-----------------------------------------------幂函数x的y次方,编译的时候老是说类型冲突,不知道为什么,就*掉了;如果哪位知道原因的话,劳烦告诉我下
/*extern double pow(double x,int y)
{
    int k;
    double mi=1;
    for(k=0;k<y;k++) mi=mi*x;
    return(mi);   
}*/
double sin(double z);
double cos(double z);
double asin(double z);
-----------------------------------------------------主程序 用来查看运行结果的
int main(void)
{
  int ii;
  double h,A,B,xx;
  xx=0.0;
  for(ii=0;ii<20;ii++)
  {
      h=sin(xx);
      A=cos(xx);
    B=asin(xx);
    printf("x=%f\n",xx);
    printf("sinh=%f,cosA=%f,asinB=%f\n",h,A,B);
       xx=xx+0.05;
  }
  return 0;
}
-------------------------------------------sinx定义
double sin(double z)
{
 double si=0;
 int fh,j;
 for(j=1;j<=17;j++)
 {
     if((j-1)%2==0) fh=1;
     else fh=-1;
     si=si+fh*pow(z,(2*j-1))/jiec(2*j-1);
     }
 return(si);
}
-------------------------------------------cosx定义   不知道为什么sinx,cosx里的j只能取比18小的数
                                                     一大于18结果就变成#。00000d了 求解释啊。。。

double cos(double z)
{
 double si=0;
 int fh,j;
 for(j=1;j<=17;j++)
 {
     if((j-1)%2==0) fh=1;
     else fh=-1;
     si=si+fh*pow(z,(2*j-2))/jiec(2*j-2);
     }
 return(si);
}
-------------------------------------------asinx定义   但是这里的j就可以取很大的值 但是结果还是不精确 哪位高手能帮忙指点下啊??
double asin(double z)
{
 double si=0;
 int j;
 for(j=0;j<=600;j++)
 si=si+pow(z,(2*j+1))*jiecc(2*j-1)/(pow(2.0,j)*(2*j+1));
 while(si>2*pi) si=si-2*pi;
 return(si);
}
搜索更多相关主题的帖子: 编程 long include return 
2012-03-30 20:15
快速回复:急!!做STITP 编程遇到问题 求高手解释下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021144 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved