2015-02-17 92 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