| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 995 人关注过本帖
标题:sin(x) 程式问题
只看楼主 加入收藏
suckdog
Rank: 1
等 级:新手上路
帖 子:130
专家分:0
注 册:2007-9-19
结帖率:41.67%
收藏
 问题点数:0 回复次数:4 
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;
         [un][bo]aseries=aseries+aterm;[/bo][/un]      //这个地方怎么加一次,减一次
      
       }while (aterm>0.0001);         
      cout<<"for x equals "<<x<<", sin(x)="<<aseries<<endl;
      system("PAUSE");
      return 0;
}

[[it] 本帖最后由 suckdog 于 2008-3-25 09:42 编辑 [/it]]
搜索更多相关主题的帖子: sin 程式 
2008-03-25 09:39
gehouse
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2008-1-28
收藏
得分:0 
根据i来判断啊,不过建议你调整一下算法
2008-03-25 13:27
handongxue
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2008-3-25
收藏
得分:0 
用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;
}
2008-03-25 14:26
suckdog
Rank: 1
等 级:新手上路
帖 子:130
专家分:0
注 册:2007-9-19
收藏
得分:0 
#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, 谁可以在里面加点东西让他变精确点阿
2008-03-29 14:11
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 
隔一个加减的实现方法和数学里一样,可以用(-1)^N即-1的N次方作为系数来乘
为了避免大量运算,可以用(-1)^(N%2)来计算,这样系数就是1,-1,1,-1也是是加、减、加……

女侠,约吗?
2008-03-30 10:39
快速回复:sin(x) 程式问题
数据加载中...
 
   



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

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