2012-12-29 47 views
1

我試圖實現Chudnovsky algorithm來計算pi。Chudnovsky算法生成-nan

這是我實現:

int fact(int n) 
{ 
    if(n<=1) 
     return 1; 
    else 
     return fact(n-1)*n; 
} 

double calcPi(long n) 
{ 
    double z=0; 
    for(int k=0; k<n; k++) 
    { 
     z+=(pow(-1, k)*fact(6*k)*(13591409 + 545140134.0*k))/(fact(3*k)*pow(fact(k), 3)*pow(640320.0, 3.0*k+3.0/2)); 
    } 
    z*=12; 
    return 1/z; 
} 

我遇到一個小錯誤,但。當我插入大於12的N值時,我得到-nan。我猜這是由於精度有限,某種整數溢出,或者我絕對可怕的階乘實現(是的,我很懶,並且使用了遞歸,現在是凌晨2點)。

不管怎麼說,如果你以前經歷過這種情況,並且可以提出一個快速解決方案,那會很好。

也許我應該只使用Python,並停止擔心溢出。

快樂(幾乎)新的一年!

+0

爲什麼開始? python剛剛獲得無限數量的無限空間?您的問題可能會在所有最常用的語言之間共享。 – user1824407

+0

'14!'(或接近)溢出了32位整數。 '事實上(6 * k)'將會非常快地溢出。 – Mat

+0

@ user1824407「爲什麼?python剛剛獲得了無限數量的無限空間?」 - 現在誰在討論Python?這是C,它甚至不以任何方式關閉Python ... – 2012-12-29 10:30:01

回答

3

浮點算術它不是微不足道的,考慮到你的問題,我更喜歡用一些提示來回答你的問題。

您可以使用庫來解決此問題,如GMPMPFR,這是a good FAQ for both

如果你真的想掌握這一點,幾乎所有主要的編程語言,你絕對應該從閱讀IEEE 754

+0

是的,我已經多次閱讀IEEE 754(這是我第一個本季度的中期)。這只是凌晨2點(現在凌晨3點),我的想法並不正確。我的猜測是主要問題是因子函數溢出,而不是浮點精度問題。無論哪種方式,解決方案是實施GMP或MPFR。 –