泰勒定理C

泰勒定理C,c,taylor-series,C,Taylor Series,对于cosh()函数,我得到了泰勒定理的简单代码 我试图抓住一个错误——结果有时接近真实答案 如何正确地做 当我的开始为0,结束为5,细分为5时,它给出了良好的结果,但当我将5作为开始,10作为结束时,结果与预期值相差很远 #include <stdio.h> #include <math.h> int poww( float number, int a ) { float result = 1.0; int i; if( a != 0 );

对于
cosh()
函数,我得到了泰勒定理的简单代码


我试图抓住一个错误——结果有时接近真实答案

如何正确地做

当我的开始为0,结束为5,细分为5时,它给出了良好的结果,但当我将5作为开始,10作为结束时,结果与预期值相差很远

#include <stdio.h>
#include <math.h>

int poww( float number, int a )
{
    float result = 1.0;
    int i;
    if( a != 0 );
    {
        for( i = 0; i < a; i++ ) {
            result = result * number;
        }
    }
    return result;
}

int factorial(int n)
{
    switch (n) {
    case 0:
        return 1;
        break;
    default:
        return n * factorial(n-1);
    }
}

void main()
{
    puts("Enter start: ");
    float start;
    scanf("%f", &start);

    puts("\nEnter end: ");
    float end;
    scanf("%f", &end);

    puts("\nSubintervals:");
    int subinterval;
    scanf("%d", &subinterval);

    float h = (end - start) / (float)subinterval;
    printf("h is : %3.2f \n", h);

    double x, result, temp;
    int n;

    for( x = start; x <= end; x += h) {
        result = 0;
        for(n = 0 ;  ; n++) {
            temp = poww(x, 2 * n) / (factorial( 2 * n ) * 1.0);
            if(temp < 0.00001) {
                break;
            } else {
                result = result + temp;
                printf("X = %f temp = %f, result = %f\n", x, temp, result);
            }
        }
        printf("X = %f, result = %3.2f, cosH = %3.2f\n\n", x, result, cosh(x) );
    }
    puts("Press any key...");
    getchar();
}
#包括
#包括
整数功率(浮点数,整数a)
{
浮动结果=1.0;
int i;
如果(a!=0);
{
对于(i=0;i对于(x=start;x将所有
float
类型更改为
double
,并使用
double
作为
factorial()
poww()
函数的返回类型。在这种情况下,最后两个也是最重要的

另外,
main()
上的返回类型应该是
int
,而不是
void

[我刚刚删除了poww()中的死if语句,并注意到该函数只会“加速”pow()计算。如果您担心性能,请担心计算每项的阶乘和幂,而不是将前一项乘以x^2再除以(2*n)*(2*n-1)。]

我在4到10之间得到了很好的结果,这是对代码的一个小修正:

#include <stdio.h>
#include <math.h>

double poww( float number, int a )
{
    float result = 1.0;
    int i;
    for( i = 0; i < a; i++ )
    {
        result = result * number;
    }
    return result;
}

double factorial(int n)
{
     switch (n)
      {
            case 0: return 1;
                    break;
            default: return n * factorial(n-1);
      }
}

int main(){

    puts("Enter start: ");
    float start;
    scanf("%f", &start);

    puts("\nEnter end: ");
    float end;
    scanf("%f", &end);

    puts("\nSubintervals:");
    int subinterval;
    scanf("%d", &subinterval);

    float h = (end - start) / (float)subinterval;
    printf("h is : %3.2f \n", h);

    double x, result, temp;
    int n;

    for( x = start; x <= end; x += h){
        result = 0;
        for(n = 0 ;  ; n++){
            temp = poww(x, 2 * n) / (factorial( 2 * n ) * 1.0);
            if(temp < 0.00001){
                break; }
            else{
                result = result + temp;
                printf("X = %f temp = %f, result = %f\n", x, temp, result);
            }
        }
                printf("X = %f, result = %3.2f, cosH = %3.2f\n\n", x, result, cosh(x) );
    }

    puts("Press any key...");
    getchar();
    return 0;
}
#包括
#包括
双功率(浮点数,整数a)
{
浮动结果=1.0;
int i;
对于(i=0;i对于(x=开始;x为什么要打印exp的结果?预期结果和实际结果是什么?“结果有时接近真实答案”–这不是你想要的吗?你希望结果远离实际答案吗?如果你让
poww
factorial
使用
double
s而不是
float
s?@AustinMullins当然!就是这样。我忘记了返回类型。非常感谢。建议
float result=1.0;
-->
double result=1.0;
如果(a!=0);
没有任何作用-请注意最后的
。无论如何,
如果(a!=0);
是不需要的。