我有一个编程程序,通过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,这显然是错误的。
答案 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 = 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;
}