2015-02-17 55 views
-1

我有简单的代码为泰勒定理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(); 
} 

解决问题:

函数返回一个整数,而不是双,我也改为每浮动翻番。

+0

你为什么要打印exp的结果呢? – 2015-02-17 22:54:18

+0

预期结果和实际结果是什么? – 2015-02-17 22:54:54

+0

“结果有时会接近真实的答案” - 这不是你想要的吗?你希望结果远离实际答案吗? – 2015-02-17 22:56:44

回答

1

更改所有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; 
} 
+0

推荐'float结果= 1.0;' - >'双重结果= 1.0;'' – chux 2015-02-17 23:22:48

+0

如果(A!= 0);'没有做任何事情 - 注意最终的','。无论如何,'if(a!= 0);'是不需要的。 – chux 2015-02-17 23:26:11

+0

@chux是的,我也是这样,谢谢!定影... – 2015-02-17 23:46:42