2017-03-09 3 views
2

exp関数には、次のようなセリフがあります。 exp(x) = (x^0)/0! + (x^1)/1! + (x^2)/2! + (x^3)/3! + ···。そして私はxの異なる値について計算し、電卓で結果をチェックしようとしていますが、例えば大きな値の場合、結果が増えなくなり、ほぼ真の値になってしまいます。私は485165184.00を得て、実際の値は485165195.4です。Cでexp(x)をどのように記述できますか?

このコードは、宿題の割り当てであるため、forサイクルまたは再帰関数で行う必要があります。通常TAD精度以上の7桁の数字を表すことができる

#include <stdio.h> 
#define N 13 
#define xi 3 

double fun7(int n, int m){ 
    int i; 
    double res=1, aux=0; 
    for(i=1, aux=1; i<(n+1); i++){ 
    res += aux; 
    aux *= m; 
    aux /= i; 
    } 
    return res-1; 
} 



int main() { 
    int a, b, pot, x[xi]; 
    float R[N][xi]; 

    x[0] = 5; 
    x[1] = 10; 
    x[2] = 20; 

    for(b=0; b<xi; b++){ 
     for (a=0, pot=1; a<N; a++){ 
      R[a][b] = fun7(pot, x[b]); 
      pot *= 2; 
     } 
    } 

    for(b=0; b<xi; b++){ 
     for (a=0, pot=1; a<N; a++){ 
      printf("%d\t%f\n", pot, R[a][b]); 
      pot *= 2; 
     } 
     printf("\n"); 
    } 

    return 0; 
} 
+1

長いダブルとしてキャストしてもらえますか? – Tikhon

+1

'float' - >' double' – BLUEPIXY

+0

階乗を使わずにe(x)を計算する方法があります... wikipedia、googleをチェックしてください.... –

答えて

4

floatデータ型を次のように

マイコードが見えます。

485165184には9桁の10進数があります。最後の2桁は、floatまでは無意味なノイズです。あなたは実際に4.851652e8を表示する必要があります。これは、与えられた精度でexp(20)の正しい値です。

精度を上げたい場合は、doubleまたはlong doubleデータ型を使用してみてください。

+2

さらに、おそらく彼は間違った順序で用語を合計することよりも悪いものにしているだろう。あなたがシリーズを集計するとき、あなたは最小の条件から始めなければなりません。そうでなければ、それらのために十分な仮数を持たないほど大きな部分和で合計されると無視されます。 –

+1

@MatteoItalia用語の集約については同意しますが、 'exp()'ではシリーズの一方の端だけでなく両端にも小さな用語が追加されています。 – chux

+0

ありがとうございます。浮動小数点型から倍精度浮動小数点型への配列型を変更し、問題を修正しました。 –

関連する問題