c言語について質問です。
1/1+x**2の0から1までの積分がπ/4になることを利用して円周率πの値を出すプログラムを作りました。モンテカルロ法のように一辺1の正方形に点を乱数によって打ち込みそれの比によって面積計算をしています。また、コマンドライン引数で打ち込む回数とπを計算する回数を指定するようにしています。その後πの平均値と分散を算出しています。
以下のプログラムでコンパイラの実装のされ方やメモリの使用状況によって誤った結果が得られる場合があると言われたのですがどこの部分がおかしいのでしょうか?
コンパイル環境
OS: ubuntu 20.04
コンパイラ: gcc
c
1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#include <math.h> 5 6 7int main(int argc, char *argv[]){ 8 9 int iterate, i; /* number of iteration */ 10 int pi_num, j; /* number of PI */ 11 int all; /* sample of the all points */ 12 int und_func; /* number over the function */ 13 double x; /* cordinate of x */ 14 double y; /* cordinate of y */ 15 double pi; /* value of pi */ 16 double sum; /* sum of pi */ 17 double average; /* pi average */ 18 double deviation;/* square of deviation */ 19 double stan_devi;/* value of standard deviation */ 20 21 if( argc != 3){ 22 fprintf(stderr, "Please input command-line arguments\n"); 23 fprintf(stderr, "EX; file, number of sample, number of PI's execution\n"); 24 return(1); 25 } 26 sscanf(argv[1], "%d", &iterate); 27 sscanf(argv[2], "%d", &pi_num); 28 double pi_arr[pi_num]; 29 30 srand(time(NULL)); 31 32 33 for(j=0; j<pi_num; j++){ 34 all = 0; 35 und_func = 0; 36 for(i=0; i<iterate; i++){ 37 x = (double)rand()/RAND_MAX; /* generation of x cordinate */ 38 y = (double)rand()/RAND_MAX; /* generation of y cordinate */ 39 40 if ( y <= 1.0/(1.0+x*x) ){ 41 all++; 42 und_func++; 43 } else { 44 all++; 45 } 46 47 } 48 pi = 4.0 * ((double)und_func / (double)all); 49 pi_arr[j] = pi; 50 printf("No %d: PI = %.8lf\n", j+1, pi); 51 52 } 53 54 printf("\n\n"); 55 56 /* calculation of average */ 57 for(j=0; j<pi_num; j++){ 58 sum += pi_arr[j]; 59 } 60 average = sum / (double)pi_num; 61 62 /* calculation of standard deviation */ 63 for(j=0; j<pi_num; j++){ 64 deviation += (pi_arr[j]-average)*(pi_arr[j]-average); 65 } 66 stan_devi = sqrt( (1/(double)pi_num) * deviation); 67 68 printf("PI average: %.8lf\n", average); 69 printf("PI standard_deviation: %.8lf\n\n", stan_devi); 70 71 return(0); 72 } 73 74 75
回答2件
あなたの回答
tips
プレビュー