2012-12-14 24 views
-3

我寫了這段代碼。我認爲這是對的,但是當我運行它時,我會得到一個不好的結果。此代碼用於計算歐拉數。我會感謝你的回答。C計算精度低於預期的歐拉數

,我期待的結果約等於2.718281828459045,我得到的結果2.718281745910644:

  • 2.718281828459045(預期)
  • 2.718281745910644(實際)

代碼:

#include <stdio.h> 

main() { 

    int factor, counter, n = 1; 
    float total = 0, division; 

    while (n <= 20) { 
     counter = 1; 
     factor = n; 

    while (counter < n) { 
     factor *= (n - counter); 
     counter++; 
    } 

    division = 1.0/factor; 
    total = total + division; 
    n++; 
    } 

    total = total + 1; 

    printf("La constante matematica e vale aproximadamente: %.20f\n", total); 

    return 0; 

} /* Finaliza funcion main */ 
+6

你期待什麼結果,並沒有你會得到什麼結果呢? – geoffspear

+0

另外,請儘量使用英文變量名稱。 – DrummerB

+3

啊,是的,「壞結果」的錯誤信息。你有沒有仔細撣過經紗遏制領域? – 2012-12-14 19:38:33

回答

4
while (n <= 20) { 
    contador = 1; 
    factorial = n; 

    while (contador < n) { 
     factorial *= (n - contador); 
     contador++; 
    } 
    // snip 
    n++; 

int,如果它是32位整數類型,則只能保留高達12!的分解因子。對於32位整數,13! = 6227020800太大。因此你有溢出,結果是完全錯誤的。

如果factorialdouble或64位整數而不是int,那麼您可能會得到一些好的結果。

的(相對小的)錯誤的計算給你是因爲使用float代替doubletotaldivision

我們計算的良好近似edouble

Prelude Text.FShow.RealFloat> FD $ exp 1 
2.718281828459045090795598298427648842334747314453125 

和轉換那到一個float

Prelude Text.FShow.RealFloat> FF $ realToFrac it 
2.71828174591064453125 

您得到的值是:2.718281745910644模以不同的印刷精度。它的計算exp 1當作爲浮動,我們會得到相同的:

Prelude Text.FShow.RealFloat> FF $ exp 1 
2.71828174591064453125 

最接近float值期望的結果:

Prelude Text.FShow.RealFloat> FF 2.718281828459045 
2.71828174591064453125 
+0

您好!我將變量類型改爲double類型,但它對程序沒有任何影響,它給了我相同的結果,什麼是錯的? D: –

+2

這是因爲你使用'float'而不是'double'作爲結果,你不能比'float'更好的逼近。 –

+0

我懂了!非常感謝Daniel Fischer! :DD –