大虾们帮帮忙,看看这个算法有什么问题

xiaokiss2008 2011-07-13 11:00:06
我自己编了个程序 核心是算法(sin函数) 但始终结果不对
我这个算法是想利用泰勒公式来编出sin函数
请指教
double Mysin(const double m,const int n)
{
int i;
double y,fenzi,fenmu,xishu;
fenmu=1,y=0;
for(i=2;i<n;i++)
{
fenzi=pow(m,2*i-1);
fenmu=(2*i-1)*(2*i-2)*fenmu;
xishu=pow((0-1),2*n-1);
y=m+xishu*fenzi/fenmu;
}
return y;
...全文
79 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gongjianmaliang 2011-07-14
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>
double Mysin(const double m,const int n)
{
long long i;
long double y,fenzi,fenmu,xishu;
fenmu=1,y=m;
for(i=2;i<n;i++)
{
fenzi=pow(m,2*i-1);
fenmu=(2*i-1)*(2*i-2)*fenmu;
xishu=pow(-1,2*i-1);
y=y+xishu*fenzi/fenmu;
}
return y;
}
int
main(void)
{
printf("sin 3.14=%f\n",Mysin(3.14,5));
printf("sin 3.14/6=%f\n",Mysin(3.14/6,5));
printf("sin 3.14/2=%f\n",Mysin(3.14/2,5));
printf("sin 3.14/4=%f\n",Mysin(3.14/4,100));
return 0;
}
也许 ,由于计算机精度原因,测试数据越小越接近真实值
xiaokiss2008 2011-07-14
  • 打赏
  • 举报
回复
为什么只能画出 pi/2的图像 纠结
xiaokiss2008 2011-07-14
  • 打赏
  • 举报
回复
我试了下 还是不行啊 我直接放完整代码上来了

#include<conio.h>
#include<graphics.h>
#include<math.h>
#define pi 3.14159265
void DrawCoord();
void Drawstg();
void Drawsin();
void initgr(void)
{
int driver,mode;
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"");
}
int main(void)
{
initgr();
DrawCoord();
Drawstg();
double Mysin(const double m,const int n);
Drawsin();
getch();
closegraph();
return 0;
}
void DrawCoord() /*画坐标系*/
{
line(200,0,200,400); /*y轴*/
line(0,200,400,200); /*x轴*/
line(200,0,195,5); /*箭头*/
line(200,0,205,5);
line(400,200,395,195);
line(400,200,395,205);
outtextxy(180,10,"y"); /*标出y轴*/
outtextxy(380,180,"x"); /*标出x轴*/
outtextxy(210,210,"O");/*标出原点*/
}
void Drawstg()/*标出刻度尺*/
{
int x,y,i;
x=200,y=400;
for(i=0;i<400;i++)
{
line(x+5,y,x,y);
y-=10;
}
x=400,y=200;
for(i=0;i<400;i++)
{
line(x,y-5,x,y);
x-=10;
}
}
double Mysin(const double m,const int n)
{
int i;
double y,fenzi,fenmu,xishu;
fenmu=1,y=m;
for(i=2;i<n;i++)
{
fenzi=pow(m,2*i-1);
fenmu=(2*i-1)*(2*i-2)*fenmu;
xishu = pow((double)(-1),i-1);
y+=xishu*fenzi/fenmu;
}
return y;
}
void Drawsin()/*画出sin函数*/
{
int x;
double y,p,q;
moveto(200,200);
for(x=200;x<=(40*pi+200);x=(x+1))
{
//double Mysin(const double m,const int n);
p=0.05*(x-200);
q=Mysin(p,1000);
y=(0-100*q)+200;
lineto(x,y);
}
}
xiaokiss2008 2011-07-14
  • 打赏
  • 举报
回复
顶起 不能沉
matrixcl 2011-07-13
  • 打赏
  • 举报
回复
首先把泰勒公式列一下:(这件事情本该楼主做的)
sinx=x-x^3/3!+x^5/5!...

最小改动的可用版本

double Mysin(const double m,const int n)
{
int i;
double y,fenzi,fenmu,xishu;
fenmu=1,y=0;
y = m;
for(i=2;i<n;i++)
{
fenzi=pow(m,2*i-1);
fenmu=(2*i-1)*(2*i-2)*fenmu;
xishu = pow((double)(-1),i-1);
y += xishu*fenzi/fenmu;
}
return y;
}


优化过的代码:

double Mysin(const double m,const int n)
{
double numerator = m;
double ret = numerator;
double denominator = 1;
for(int i=1;i<n;i++)
{
denominator *= (2*i * (2*i + 1));
numerator *= (-1 * m * m );
ret += (numerator / denominator);
}
return ret;
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧