みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

うわ・・・私の円周率計算プログラム、 遅すぎ・・・?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

うわ・・・私の円周率計算プログラム、 遅すぎ・・・?

投稿記事 by みけCAT » 12年前

円周率を松永良弼の公式2を使って計算するプログラムを作ってみました。
matsunaga.png
松永良弼の公式2(再構成バージョン)
matsunaga.png (10.41 KiB) 閲覧数: 244 回
マジックナンバー

CODE:

/* (2*n-1)*(2*n-1)MAX_NOW_NUMBER) {
			fputc('\n',stderr);
			fputs("ごめんなさい、このソフトの限界を超えました。\n",stderr);
			fputs("今まで時間を無駄に頂いてしまい、申し訳ありません。\n",stderr);
			fputs("心から深くお詫び申し上げます。\n",stderr);
			free(pi);
			free(now);
			return 1;
		}
		if(nowNumber<=MAX_MUL) {
			firstNonZero=mulLongInt(now,(2*nowNumber-1)*(2*nowNumber-1),calcMemory,firstNonZero);
		} else {
			firstNonZero=mulLongInt(now,2*nowNumber-1,calcMemory,firstNonZero);
			firstNonZero=mulLongInt(now,2*nowNumber-1,calcMemory,firstNonZero);
		}
		if(nowNumber<=MAX_DIV) {
			firstNonZero=divLongInt(now,(4*nowNumber)*(4*nowNumber+2),calcMemory,firstNonZero);
		} else {
			firstNonZero=divLongInt(now,4*nowNumber,calcMemory,firstNonZero);
			firstNonZero=divLongInt(now,4*nowNumber+2,calcMemory,firstNonZero);
		}
		nowNumber++;
		updateProgress(firstNonZero);
		if(nowNumber%100==0) {
			nowTime=timeGetTime();
			usedTime+=nowTime-prevTime;
			prevTime=nowTime;
		}
		/* 中断セーブ */
		/* 略 */
	}
	usedTime+=timeGetTime()-prevTime;
	fputc('\n',stderr);
とりあえず100桁の計算に成功し、10万桁を計算してみる。
ん…遅い。
10万桁の計算に1分49秒もかかってしまった。
自然対数の底なら、10万桁を6秒で計算できる。
やはりπは美しい分計算しにくいのか。
いや、違う。
試しに、スーパーπと比較してみる。
スーパーπと同じ桁数の131072桁を計算すると…
スーパーπ:0分2秒
自作プログラム:4分20秒
なんと130倍もの時間がかかっている
これは遅い。遅すぎる。なぜだ。収束が速いはずなのに。
picalc_is_slow.png
僕の円周率計算は遅い
picalc_is_slow.png (29.73 KiB) 閲覧数: 196 回
添付ファイル

[拡張子 zip は無効化されているため、表示できません]

最後に編集したユーザー みけCAT on 2013年1月02日(水) 22:32 [ 編集 2 回目 ]

コメントはまだありません。