名無しです。
藤岡和夫さんの[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 するとかなりスローダウンしてしま
うので、それよりは断然約に立ちます。
--