当我更改numberOfTerms时,为什么我的代码不准确?

时间:2016-11-13 08:27:48

标签: c

#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'的隐式声明。

2 个答案:

答案 0 :(得分:1)

我们假设您将numberOfTerms的值保持为10。然后,在cosinesine函数的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,代码会将d​​ouble解释为逐位模式,导致完全不正确的值 - 不只是double的整数部分。