gpt4 book ai didi

使用阶乘函数和余弦函数通过麦克劳林级数近似计算 cos(x)

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:59 27 4
gpt4 key购买 nike

我有一个作业要编写一个程序来通过 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,这显然是错误的。

最佳答案

第一个错误是未初始化的变量 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 快得多。因此你得到越来越大的值(value)因此你得到另一个溢出。这是有效的代码:

#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;
}

关于使用阶乘函数和余弦函数通过麦克劳林级数近似计算 cos(x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50537298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com