#include <stdio.h>
double pi = 3.141592653589;
int numberOfTerms = 5;
int factorial(int n)
{
if(n > 1)
return n * factorial(n - 1);
else
return 1;
}
double DegreesToRadian( double degrees )
{
return degrees * pi / 180;
}
void cosine(double cos){
int x = 0;
double ans = 1;
int exponent = 2;
int isPlus = 0;
for(x; x < numberOfTerms - 1; x++){
if(isPlus == 0){
ans -= (pow(cos, exponent))/factorial(exponent);
exponent += 2;
isPlus = 1;
}else{
ans += (pow(cos, exponent))/factorial(exponent);
exponent += 2;
isPlus = 0;
}
}
printf ("%.12f \t", ans);
}
void sine(double sin){
int x = 0;
double ans = sin;
int exponent = 3;
int isPlus = 0;
for(x; x < numberOfTerms - 1; x++){
if(isPlus == 0){
ans -= (pow(sin, exponent))/factorial(exponent);
exponent += 2;
isPlus = 1;
}else{
ans += (pow(sin, exponent))/factorial(exponent);
exponent += 2;
isPlus = 0;
}
}
printf ("%.12f \n", ans);
}
int main()
{
double j = -180.00;
printf(" ");
printf("\n\n");
for (j; j <= 180; j += 5){
printf("%.2f \t", j);
printf( "%.12f \t", DegreesToRadian(j));
cosine(DegreesToRadian(j));
sine(DegreesToRadian(j));
}
return 0;
}
我正在使用泰勒系列找到一个数字的sin和余弦但是当我将numberOfTerms更改为10或15时它变得不准确(waaaaaaaaayay off),我需要更改什么才能使其准确? (是的,我的功能不是最佳的)
如果重要的话,我得到一个[警告]不兼容的内置函数'pow'的隐式声明。
答案 0 :(得分:1)
我们假设您将numberOfTerms
的值保持为10
。然后,在cosine
和sine
函数的for
循环中,每次exponent
递增2
。并且,您在分母中使用exponent
的阶乘。
如果循环运行9
次,exponent
的值将增加为2, 4, 6, 8, 10, 12, 14, 16, 18
。
我们知道14! = 87178291200
。但是signed int
(用于返回阶乘函数的结果)可以保持正值2147483647
。发生溢出。
我建议您使用double
(或甚至unsigned long long
)作为返回类型和阶乘函数的参数。但是不要试图计算大数的因子,因为它们不适合C中的任何数据类型。
此外,由于您尚未自己定义pow
功能,我认为您在顶部缺少#include<math.h>
。
另一个建议是,将pi
定义为符号常量而不是全局变量。
答案 1 :(得分:0)
pow
的隐式声明返回一个int,但实际定义返回double,代码会将double解释为逐位模式,导致完全不正确的值 - 不只是double的整数部分。