Ellipse circumference

楽しみにしていた Ellipse circumference が公開になった。まったくかなわなかった notogawa さんの C の解

float x,a,b;
main(n){
    for(;~scanf("%f%f",&a,&b);printf("%.f\n",x))
        for(n=4e3;--n;)x=a*6.2832+(n-2+.75/n)/n*(1-b*b/a/a)*x;
}

これ、すごいな。2 回目の(外側)ループ以降、x が初期化されていない。なんでだ?と思ったが、内側ループが n=4e3 と高次の項から低次へ向かう方向で計算している。つまり、x の最初の値、つまり、前の計算結果(printfで出力しているもの)は、誤差範囲に葬り去っているということだ!まじかぁ。すごいな。
###とりあえずここまで。仕事中なので、残りはあとで書こう。。。

2/2追記:

notogawa さんご自身がすでに詳しい解説をされていた。⇒ http://d.hatena.ne.jp/notogawa/20110201/1296557658
C で、n を 8e3 から 2 ずつ減らす方法でさらに短くならないか?とやってみたが、結果は同じ 119B だった。まぁ、この程度の式変形はすでにケアされているか。。。

float x,a,b;main(n){for(;~scanf("%f%f",&a,&b);printf("%.f\n",x))for(n=8e3;n-=2;)x=a*6.2832+(n-4+3./n)/n*(1-b*b/a/a)*x;}

追記:

っと思ったら 1B 縮んだ。