Вычисление cos (x) через приближение рядов Маклаурина с использованием факториальной и косинусной функций - PullRequest
0 голосов
/ 26 мая 2018

У меня есть задание закодировать программу для вычисления 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 голосов
/ 26 мая 2018

Первая ошибка - неинициализированная переменная 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 = 1, x = 2 и a > 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...