

数理の問題をプログラミングしてみようと思って、ラマヌジャンの式をプログラムしたのですが、どうも実行結果が期待しているものと違うような気がします。

ちなみに、今回プログラムしたいと思った問題は、4/π(=3.1415...)の近似値を調べるもので、試行回数が多いほど数値が期待しているものに限りなく近くなるというものです。

以下プログラムした式は次のようなものです。  
＜式＞  
[![画像の説明をここに入力](https://i.stack.imgur.com/MoET8.png)](https://i.stack.imgur.com/MoET8.png)

<プログラム>

[code]

    #include <stdio.h>
    #include <math.h>
    
    int fact(int n)
    {
       if(n==0){
         return 1;
       } else if(n==1){
         return 1;
       } else{
         return n*fact(n-1);
       }
    }
    
    double sum(int n)
    {
       int i;
       double s;
       s=0.0;
       for(i=0;i<n;i++){
        s=s+(pow(-1,i)*fact(4*i)*(1123+21460*i))/(pow(882,2*i+1))*(pow((pow(4,i)*fact(i)),4));
       }
       return s;
    }
    
    int main(void)
    {
       int i,n;
       printf("ラマルジャンの公式を利用して、4/πの値を出力します。\n");
       printf("試行回数は: "); scanf("%d",&n);
       
       printf("値は%f\n",sum(n));
       return 0;
    }
      
    
[/code]

実行結果

[code]

    ~/suuri$ ./a.out
    ラマルジャンの公式を利用して、4/πの値を出力します。
    試行回数は: 500
    値は-791.054116
    ~/suuri$ ./a.out
    ラマルジャンの公式を利用して、4/πの値を出力します。
    試行回数は: 499
    値は-791.054116
    
[/code]

このように、実際は試行回数が多いほど答は「1.27...」ぐらいの値に近づくはずなのですが、そうはならなかったので、おそらく関数sumがおかしいのだろうと思い見直してみましたが、自分ではどこが間違っているのかよくわかりませんでした。


CC BY-SA 4.0
2021-02-20T10:30:47.597
74154
2023-05-24T16:10:03.370
41837
question
c
ラマヌジャンの式をプログラミング


user39889 さんのコメントより

> `(pow((pow(4,i)*fact(i)),4))` が分母ではなく分子になっていますね。 – user39889

[tueda](https://ja.stackoverflow.com/users/36010/tueda) さんのコメントより

>
> （分子→分母を直した後）収束が速いので倍精度だと`n=3`くらいで十分かと思います。（`fact(4*n)`も`int`だとすぐにオーバーフローします。）

以上で解決しているようです。 （見た目未解決にならないようコミュニティ wiki の回答として投稿します）


CC BY-SA 4.0
2023-05-24T16:10:03.370
94964
2023-05-24T16:10:03.370
2901
74154
answer