CLang
やっぱりC
モンテカルロ法でPiを計算するプログラムをC言語に書き換えると以下のようになります.
#include <stdio.h> #include <stdlib.h> int main(void){ int N,i; scanf("%d",&N); double x,y,r2,S=0; for (i=0;i<N;i++){ x=(double)rand()/RAND_MAX; y=(double)rand()/RAND_MAX; r2=x*x+y*y; if (r2<1.0) S+=1; } printf("%6d,%10.5f\n",N,4.0*S/N); }
これを
[BobsNewPBG4-6:~/NumRecipeEx07/CLang] bob% gcc Pi0.c
でコンパイルして,実行時間を計ってみます.上がC言語版,下がRuby版です.
[BobsNewPBG4-6:~/NumRecipeEx07/CLang] bob% time ./a.out 10000000 10000000, 3.14188 0.702u 0.002s 0:06.12 11.4% 0+0k 0+0io 0pf+0w
[BobsNewPBG4-6:~/NumRecipeEx07/Week5] bob% time ruby pi0.rb 10000000 3.1417264 17.047u 0.015s 0:24.34 70.0% 0+0k 0+0io 0pf+0w
だいたいこの計算で24倍の差がでています.Rubyで1日かかる計算がC言語だと1時間でできる勘定です.
課題1
モンテカルロ法の試行回数(1e5,1e6,1e7,1e8)と変えて,かかる時間を計測せよ.時間の計りかたは下記のスクリプトを参照せよ.さらに,gnuplotで両対数プロットせよ.
t1=Time.now sleep(1) t2=Time.now puts t2-t1
Ruby版のモンテカルロ法とも比較せよ.
課題2
台形近似に基づく数値積分でPiを求めるプログラムをC言語で書け.計算時間の計測,Ruby版との比較,gnuplotによるグラフ表示をそれぞれおこなえ.
Keyword(s):
References:[LinuxEx]