Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c语言中创建正弦函数_C_Math - Fatal编程技术网

如何在c语言中创建正弦函数

如何在c语言中创建正弦函数,c,math,C,Math,我知道在math.h中有一个sin函数,但我想自己做这个函数,只是为了好玩。我基于正弦函数的Macluarin扩展创建了sin函数。 我写了一个幂函数和一个阶乘函数,它们在main中正常工作,但是它们在sin函数中不工作 这是我的密码: int main() { int i; double y; printf("\n\nPlease enter a value to find corresponding sin value\n"); scan

我知道在
math.h
中有一个
sin
函数,但我想自己做这个函数,只是为了好玩。我基于正弦函数的Macluarin扩展创建了
sin
函数。

我写了一个幂函数和一个阶乘函数,它们在
main
中正常工作,但是它们在
sin
函数中不工作

这是我的密码:

int main()
{
    int i;
    double y;
    printf("\n\nPlease enter a value to find corresponding sin value\n");
    scanf("%d",&i);
    y=sin(i);
    printf("\nYour value is\n %f",y);
    return 0;
}
    
double sin(int z)
{
    int i=1;
    double value,val2,val3,sum=0;
    for(i=1;i<33;i+=2)
    {
        val2=power(z,i);
        val3=factorial(i);
        value=val2/val3;
        if(((i-1)/2)%2!=0){
            sum=sum-value;    //((power(x,i))/factorial(i));
        }else
        {
            sum=sum+value;
        }
    }
    printf("\n%f\n",sum);
    return sum;
}

int factorial(int x)
{
    int i,sum=1;
    for(i=1;i<=x;i++)
    {
        sum = sum*i;
    }
    return sum;
}

int power(int x,int y)
{
    unsigned long long int i,sum=1;
    for(i=1;i<=y;i++)
    {
        sum=sum*x;
    }
    return sum;
}
intmain()
{
int i;
双y;
printf(“\n\n请输入一个值以查找相应的sin值\n”);
scanf(“%d”、&i);
y=sin(i);
printf(“\n您的值是\n%f”,y);
返回0;
}
双正弦(整数z)
{
int i=1;
双值,val2,val3,和=0;

对于(i=1;i公式要求以弧度为单位的值,但您使用的是整数,所以我假设您给它度。这将使公式给出错误的值

您还可以使用
int
s作为来自
factorial()
power()
的返回值,这将导致溢出。如果您有32位机器,即使给公式加2,也会溢出,因为
int
只能增加到2^31-1,并且您试图得到2^33

另外,如果编译器没有抱怨您从返回类型为
int
的函数返回了
无符号长整型int
,请增加警告级别。

int factorial()
溢出非常快。
13!
不适合32位整数。
21!
不适合64位整数

int power()
似乎完全关闭。为什么您希望参数
x
int
?顺便说一句,它也会很快溢出

计算McLauren级数(几乎)正确的方法是表示上一项的下一项:

    term = (-1) * term * (x*x) / ((n+1)*(n+2));
    sum += term;
    n += 2;

它应该可以工作,但可能会导致数值不稳定,并且具有较大的
x
。A是一个最终答案。

正如其他人已经指出的那样,在它们自己的函数中计算
阶乘
部分是一个坏主意,因为即使对于非常小的值,它也会溢出

您可以尝试组合计算,以便在每个循环中都有一个
乘法
和一个
除法

像这样:

#include <stdio.h>

// This function returns the contribution from the k'th element
double kth_contribution(double x, int k)
{
    int i;
    int s = -1.0;
    double d = 1.0;
    if (k < 0) return 0;
    if (k == 1) return x;
    if (k % 2 == 0) return 0;
    if ((k-1) % 4 == 0) s = 1.0;

    for (i=1; i<=k; ++i)
    {
        d = d * x / i;
    }
    d = s * d;
    return d;
}

int main(void) {
    int k;
    int x = 1.0;
    for (k=0; k<33; ++k)
    {
        printf("k=%d: %0.80f\n", k, kth_contribution(1.0, k));
    }
    return 0;
}

现在您只需要将所有贡献相加。

如果您查看标准数学库,就像它们都做参数缩减一样。Macluarin系列最适合于较小的x值。因此,对于较大的x,您希望将x放入一个较小的范围内。如果我们可以在-pi/2和pi/2之间找到y,从而使x=y+2kpi或x=pi-y,则以弧度工作+2kpi


这将有助于使y进入一个小范围,意味着您需要更少的级数项来计算。

除了溢出之外,使用整数将导致小数的截断。哦,您在调用函数之前声明了它们吗?在
main
函数上方的某个地方确实有函数原型?如果使用它,这有什么用途离子
如果((i-1)/2)%2!=0)
?@ARBY这是针对
-
值的,如sum-x^3/3!
k=0: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=1: 1.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=2: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=3: -0.16666666666666665741480812812369549646973609924316406250000000000000000000000000
k=4: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=5: 0.00833333333333333321768510160154619370587170124053955078125000000000000000000000
k=6: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=7: -0.00019841269841269841252631711547849135968135669827461242675781250000000000000000
k=8: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=9: 0.00000275573192239858925109505932704578867742384318262338638305664062500000000000
k=10: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=11: -0.00000002505210838544172022386617932135366437762513669440522789955139160156250000
k=12: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=13: 0.00000000016059043836821615925802332523156679827680548555690620560199022293090820
k=14: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=15: -0.00000000000076471637318198174152558028953378813433183758263567142421379685401917
k=16: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=17: 0.00000000000000281145725434552099254097088490189675684814327692728763707918915316

....