作者: dune
日時: 2005/10/09(21:41)
名無しです。

藤岡和夫さんの[TSperl:611] Re: 初心者のための10倍プログラムを正しくする方法から
> こんな方法があるのですね。これでなぜ桁落ちを再度足しこむことになるのか
>はよくわからないのですが(^^;)

|foreach my $i (1 .. $n){
|    my $x = sin(2 * pi * $i / $n);
|    
|    # これも $sum += $x を計算しているが、発生した桁落ちを $r に
|    # かき集めて大きくしてから $sum に足し込んでいる。
|    $r += $x; $t = $sum; $sum += $r; $t = $sum - $t; $r -= $t;
|}

例えば上の式で $x が 0.1 で $sum が 100 で、100 に 0.1 を足しても
桁落ちして 100 になってしまう、しかし 0.2 を足した場合は桁落ちしな
い、と仮定して机上トレースするとわかります。1回目は桁落ちして足せ
なかった 0.1 が2回目のループでは 0.1 + 0.1 = 0.2 になって無事足せ
ることがわかります。

なかなかうまい方法です。その辺の参考書を見てもこういう方法で DFT
をやってる本はないです。-Mbignum するとかなりスローダウンしてしま
うので、それよりは断然約に立ちます。
--