网站首页  |  业界新闻  |  技术文章  |  视频教程  |  下载频道  |  程序源码  |  个人空间  |  编程论坛
 
学习型 ASP/PHP/ASP.NET 主机 30元/年 全能 ASP/PHP/ASP.NET 主机,支持月付 专业 MSSQL 数据库空间,支持月付 专业 MySQL 数据库空间,支持月付
发新话题
打印

sin(x) 程式问题

sin(x) 程式问题

我们都知道 sin(x)=x-(x^3/3!)+(x^5/5!)-(x^7/7!)+(x^9/9!)-......

现在我程式写了差不多了,但是中间这里隔一个加一次,隔一个减一次不知道如何做到,高手帮帮忙, 我的程式如下:

#include <iostream.h>
#include <stdlib.h>
#include <cmath>

int main()
{
      float i=1.0;
      double degree, aseries, aterm, denum=1.0, p_denum, num, x;

      cout<<"Input a number in degrees.\n";
      cin>>degree;

      x=degree*(3.14159/180.0);
      aseries=x;
      
      do
      {
         num=pow(x, i);
         p_denum=denum;
         denum=(p_denum*i);
         i=i+2.0;
         aterm=num/denum;
         aseries=aseries+aterm;      //这个地方怎么加一次,减一次
      
       }while (aterm>0.0001);         
      cout<<"for x equals "<<x<<", sin(x)="<<aseries<<endl;
      system("PAUSE");
      return 0;
}

[ 本帖最后由 suckdog 于 2008-3-25 09:42 编辑 ]

TOP

根据i来判断啊,不过建议你调整一下算法

TOP

用sgn代表符号

你的程序有错误,修改后如下:

#include<iostream>
#include<cmath>
#include <cstdlib>
using namespace std;

int main()
{
    double i=1.0,sgn=1;
    double degree, aseries=0, aterm, denum=1.0, num, x;

    cout<<"Input a number in degrees.\n";
    cin>>degree;

    x=degree*(3.14159/180.0);
    aseries=x;

    do
    {    
        sgn*=-1;    
        i=i+2.0;                        //开始时从i=3计算。
        denum*=i*(i-1);                 //这样计算阶乘

        num=pow(x, i);
        aterm=num/denum;
        aseries=aseries+sgn*aterm;      //sgn代表符号

    }while (aterm>0.0001);         
    cout<<"for x equals "<<x<<", sin(x)="<<aseries<<endl;
    cout<<"Real sin(x)=="<<sin(x)<<endl;
    system("PAUSE");
    return 0;
}

TOP

#include <iostream.h>
#include <stdlib.h>
#include <cmath>

float sinx(float);

int main()
{
      float i=1.0;
      double degree, aseries, x;

      cout<<"Input a number in degrees.\n";
      cin>>degree;
      
      aseries=sinx(degree);

      cout<<"when degree="<<degree<<", sin(x)="<<aseries<<endl;
      system("PAUSE");
      return 0;
}

float sinx(float y)
{
    float i=1.0, sgn=1;
    double aseries, aterm, denum=1.0, p_denum, num, x;
   
    x=y*(3.14159/180.0);
    aseries=x;
    do
    {   
        sgn*=-1;   
        i=i+2.0;                        
        denum*=i*(i-1);               

        num=pow(x, i);
        aterm=num/denum;
        aseries=aseries+sgn*aterm;      
    }while (aterm>0.0001);  
      
    return aseries;
}

我从写了一遍, 基本运行可以了, 但是比方说我算90度, sin(x)=1, 我想要
sin(x)=0.999999683, 谁可以在里面加点东西让他变精确点阿

TOP

隔一个加减的实现方法和数学里一样,可以用(-1)^N即-1的N次方作为系数来乘
为了避免大量运算,可以用(-1)^(N%2)来计算,这样系数就是1,-1,1,-1也是是加、减、加……
大难不死 必有后福

TOP

发新话题