- 締切済み
パソコンを使って数列の和を求めたいのですが…
1/1+1/2+1/3+…+1/n という数列の和をある数まで求めたいのですが、エクセルだと自動なようで結構手間がかかります。nがすごく大きい数字を想定しているので… となるとやはりプログラムしかないでしょうか? もし知ってる方いたらどのような方法が1番効率的かを教えてもらいたいです。 これをどのカテゴリに書き込もうか迷いました。もしここが不適当であれば指摘してください。適切なところに移動します。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- kabaokaba
- ベストアンサー率51% (724/1416)
>Perlというのはフリーのものなのか教えていただけないでしょうか? 少しはぐぐったりや本屋をみたりしましょう. 世界でもっとも知られたスクリプト言語の一つ といってもいいものです. 2,000,000項まで100桁だと 16.08587 36534 25731 44079 83596 06834 26424 47242 06398 10456 27571 48488 06287 47115 04466 60207 26898 69831 19070 76574 って感じのようです. 計算時間は1時間以上かかってますので, まあ,あまり実用的ではありません. 現実的には,きっちり精度を考えて 近似計算するのが筋でしょう. #それにしても・・・発散が遅いとは知ってたけども #ここまで遅いとは(^^;
- kabaokaba
- ベストアンサー率51% (724/1416)
> となるとやはりプログラムしかないでしょうか? そうなります.桁数が大きくなると エクセルとか使うと誤差が大きくなりすぎるでしょう. まじめに「数値計算」するなら誤差評価も必要です. けどまあ,時間がかかってもいいなら,スクリプト言語で 任意精度の実数演算をサポートしてるものを使えば それなりに計算できます. 例えば,1+1/2+・・・+1/10000 の値の小数点以下100位までは 10.78760 60360 44382 26417 84779 04851 60533 48592 62945 57769 17183 89460 95668 16020 24943 15950 68001 25127 29008 08825 となるようです. この計算をさせたPerlのスクリプトを乗っけておきます. スピードは遅いです. use strict; use warnings; use Math::BigFloat; Math::BigFloat->accuracy(110);##少し大きめに110桁 my $x= Math::BigFloat->new(1); for (1..10000){##ここの10000が1/10000を表わす $x = $x+Math::BigFloat->new(1)->bdiv($_); } print $x->bround(110);##110桁で丸める
- nakaizu
- ベストアンサー率48% (203/415)
nの数値と要求されている精度はどのくらいなのですか? 1/1+1/2+…+1/n=S(n) とすると よく知られているように lim(n→∞)(S(n)-log n)=γ(オイラー定数0.577215664901532…) なので、log n+γで大体の数値はわかります。(log は自然対数です) 誤差は1/(2n) くらいです。 もっと精度が必要ならばもう少し精度のたかい近似値計算法もあります。
- okormazd
- ベストアンサー率50% (1224/2412)
excelの有効桁数は15桁です。 1/n<10^-15より大きい n なら加算しても答えは同じです。増えません。 それまでにも桁落ちがあるので、15桁の精度は得られません。 精度が必要ならπを求めるような何らかの工夫をするか、 どこかで妥協するしかないでしょう。 プログラムしても事情は同じです。
- koko_u_
- ベストアンサー率18% (459/2509)
n がすごく大きいと Excel だと桁落ちしちゃうんじゃないかな? Excel の有効桁数とか知らないけど。具体的にどのくらいの「大きさ」を想定しているのですか?
数秒で済む手順を教えます。 A1セルをコピーします(Ctrlを押しながらCが便利) コピーしたらそのまま(A1セルのまま) ShiftとCtrlをおしたまま下矢印(↓)キーを押す。 Enterを押す これでA1~A65536までコピーが完了します。
excelなら簡単です とりあえず1/1~1/65535まで足す方法 A1セルに =1/row() と入力してこのセルを下方向の最後までコピー A65536セルに =sum(A1:A65535) これで1/1+1/2+1/3……+1/65535 ができました。 こらにB列C列を利用すればもっと沢山計算できます。
お礼
その方法でやりましたが、”と入力してこのセルを下方向の最後までコピー”の部分が激しく面倒くさく、手間がかかってしまうために今回質問をしてみました。 2000000項くらいまでこれで足してみたんですが全然足りないんです…
お礼
ありがとうございます!! まだ見ているのであればPerlというのはフリーのものなのか教えていただけないでしょうか?