天天看點

基于過程的sin函數的計算

基于泰勒展開式,我們可以友善的計算正弦函數的值,那麼如果要求不能使用函數呢,可能會帶來點小麻煩,下面是純過程的正弦函數的計算,精度可控

<span style="font-size:24px;">#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
    double x;
    double sin_res=0;//正弦結果
    double sin_res_before=0;
    int sin_presicion=1e-4;//sin循環次數
    int PI_precision=1000000;//PI循環次數
    int flag;//正負号
    int deep;//目前階數
    double mol;//分子
    double den;//分母
    double PI=0;
    //計算PI
    {
        flag=1;
        mol=4.0;
        den=1.0;
        for(int i=0; i<PI_precision; i++)
        {
            //printf("num=%lg\n",(flag)*(mol/den));
            PI+=(flag)*(mol/den);
            flag=-flag;
            den+=2.0;
        }
    }
    x=PI*0.25;
    //第一問
    {
        printf("k   ");
        for(double i=0; i<=1.0; i+=0.1)
        {
            printf("%-7lg",i);

        }
        printf("\n");
        printf("sin ");
        for(double i=0; i<=1.0; i+=0.1)
        {
            x=i*PI/2.0;
            sin_res=0;
            sin_res_before=-1;
            flag=1;//初始化
            deep=1;
            mol=x;
            den=1.0;
            while((sin_res-sin_res_before)>sin_presicion)
            {
                //printf("mol=%lg,den=%lg\n",mol,den);
                sin_res_before=sin_res;
                sin_res+=flag*(mol/den);
                deep+=2;
                mol*=x*x;
                den*=deep*(deep-1);
                flag=-flag;
            }
            printf("%.4lf ",sin_res);
        }
        printf("\n");
    }

    //第二問
    {

    }
    /*
    //計算級數展開式
    {
        flag=1;//初始化
        deep=1;
        mol=x;
        den=1.0;
        for(int p=0; p<sin_presicion; p++)
        {
            //printf("mol=%lg,den=%lg\n",mol,den);
            sin_res+=flag*(mol/den);
            deep+=2;
            mol*=x*x;
            den*=deep*(deep-1);
            flag=-flag;
        }
    }
    printf("sin(%lg)=%lg\n",x,sin_res);
    */
    return 0;
}
</span>