Первая ошибка - неинициализированная переменная 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;
}