2011-09-09 7 views
0

Cを学ぶために私はいくつかの問題を引き起こしている課題に出くわしました。私は式nの近似値の式を作る必要があります。これは次のように記述することができます。n! Cを使って(どこかの方程式誤差)

n! = n^n * e ^( - n)* sqrt(2(2 * n + 1/3)* PI)しかし、私は単に実際の値で腐食するような値を得ることはできません。 5! =私は私のコードが間違っているところを見つけ出すことはできませんいくつかの148ish

の値を取得することができます

120ish:私はすべてを試みているよう

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

#define PI 3.14156 
#define E_CONST 2.7828 

int main() 
{ 

double num; 
double calc, first, second, third, fourth; 

printf("Give an int: "); 
scanf("%lf", &num); 


first = pow(num , num); 

second = pow(E_CONST, -num); 

third = (2 * num + 1/3); 

fourth = sqrt(2*third*PI); 

//calc = first * second * fourth; 

calc = pow(num, num) * pow(E_CONST, -num) * sqrt(2*(2*num+(1/3))*PI); 
printf("Input: %f", num); 

printf("1: %.2f\n2: %.10f\n3: %.8f\n4: %.2f\n", first, second, third, fourth); 

printf("\nInt was: %.2f\n\nApproximate number: %.5f", num, calc); 

return 0; 
} 

を感じます。コードはちょっと混乱していますが、それは私が今ではそんなに混乱してしまったからです。

+0

3(2 *(num + 1/3))または((2 * num)+ 1/3)ですか? –

+4

確かに分かりませんが、 '1/3'は' 0'(整数除算)と評価されるかもしれません。 – phimuemue

+0

私は間違いなくエラーがどこにあるのでしょうか?あまりにも曖昧で間違っています。 : 3番目=((2 * num)+((float)1 /(float)3)) または 3番目=(2 *(num +(float)1 /(float)3))) –

答えて

13

3.14156PIに悪い値である:それは3.1416、または3.14159、または4 * atan(1)を使用することをお勧めします、または、POSIXの実装のために、M_PI

2.7828eため非常に悪い値である:それは2.7183、またはexp(1)を使用することをお勧めします、または、POSIXの実装のために、M_E

1/3は整数除算であり、結果は0です。1.0/3を使用することをお勧めします。

近似も正しくありません。 correct approximation

n^n * e^(-n) * sqrt((2*n+1/3)*PI) 
+0

ありがとうございました。ダブルスのために.0を試して覚えようと努力します。それは実際には間違っていた方程式でしたが(実際には私の誤解の形で)、それは実際に私が使っている本の中に書かれている方程式に起因していました。 – Dennis

+2

単に 'math.h'の' M_PI'マクロを使うのはなぜですか? – DarkDust

+1

@DarkDust: 'M_PI'は[C99標準](http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1256.pdf)では必要ありません。 *それは[POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/math.h.html)でも必要です。* – pmg

6

0の値を持つ1/3で整数除算トラップになったようです。これを浮動小数点定数1.0/3.0として記述する必要があります。

+0

あなたはそれに私を打ち負かしました:-) –

+2

これは約1週間に1回ですので、たくさんの機会があります。 – starblue

1

1/3を取得するには、おそらく1.0/3.0と入力する必要があります。

関連する問題