使用因子函数和余弦函数通过Maclaurin级数近似计算cos(x)

时间:2018-05-25 21:53:06

标签: c function

我有一个编程程序,通过Maclaurin approximation来计算cos(x)。但是我必须使用cos(x)函数和另一个函数计算cos(x)函数内分母的指数。我认为大多数情况都是正确的,但我可能会对某些内容感到遗憾,我无法弄清楚是什么。

#include<stdio.h>
#include <stdlib.h>
#include <math.h>
int fat(int);
float cosx(float);
int main()
{
    float x1;
    /* Original code: **x1 = x1 * 3.14159 / 180;** `transforms the value to radians` */
    x1 = x1 * 3.14159 / 180;                     /* transforms the value to radians */
    printf("Insert number:\n");
    scanf("%f", &x1);
    printf("Cosine of %f = %f", x1, cosx(x1));
    return 0;
}

int fat(int y)
{
    int n, fat = 1;
    for(n = 1; n <= y; n++)
    {
        fat = fat * n;
    }
    return fat;
}

float cosx(float x)
{
    int i=1, a = 2, b, c = 1, e;
    float cos;
    while(i < 20)
    {
        b = c * (pow(x,a)) / e;
        cos = 1 - b;
        a += 2;
        e = fat(a);
        c *= -1;
        i++;
    }
    return cos;
}

如果输入0,则返回-2147483648.000000,这显然是错误的。

1 个答案:

答案 0 :(得分:1)

第一个错误是未初始化的变量x1,之后您就可以使用:

int x1; // <<< uninitiated variable;
**x1 = x1 * 3.14159 / 180;** `transforms the value to radians

这将产生随机值,你应该把

int x = 0; // or some other value of your choice

在我看来,您应该在x1 = x1 * 3.14159/100;之后移动scanf("%d", x1)

使用前再次启动值e

int i=1, a = 2, b, c = 1, e;
...
b = c * (pow(x,a)) / e;
...

,而不是b = c * pow(x,a)行中潜在超出int变量范围的行。如果e = 1x = 2a > 31超出了b的范围。另一个问题是pow(x,a)比e更快地上升。因此,你会得到越来越大的价值,因此你会得到另一个溢出。以下是有效的代码:

#include <stdio.h>                                                                                                                                                                                                                       
#include <stdlib.h>
#include <math.h>

long double fact(int);
long double cosx(double);
long double my_pow (double b, int e);

int main()
{
    double x1 = 45.00;
    printf("Insert number:\n");
    scanf("%lf", &x1);
    x1 = x1 * 3.14159 / 180; // ** `transforms the value to radians`

    printf("Cosine of %f = %.10LF", x1, cosx(x1));
    return 0;
}

long double fact(int y)
{
    int n;
    double fact = 1;
    for(n = 1; n <= y; n++)
    {
        fact *= n;
    }
    return fact;
}

long double cosx(double x)
{
    int a = 2, c = -1;
    long i = 0, lim = 500;
    long double cos = 1;
    long double b = 0, e = 0;
    while(i < lim) {
        e = fact(a);
        b = c * my_pow(x,a);
        cos += b/e;
//      printf ("%le %le %le\n", e, b, cos);
        a += 2;
        c *= -1;
        i++;
    }

    return cos;
}

long double my_pow (double b, int e) {
    long double pow = 1;
    for (;e > 0; --e, pow *= b)
        ;
    return pow;
}