算術乱数の和を、プログラムの途中で求めているのですが、
確保するメモリを20000よりも多くするとコンパイルは出来るのですが、
実行する際にエラーになってしまいます。
2000000個のメモリを確保したいのですが、何がおかしいのでしょうか?
プログラムは↓です。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 2000000
int main(void)
{
unsigned long mkrandom(unsigned long a, unsigned long c, unsigned long x0);
double p[10], t, sigpk, *x;
unsigned long a, c, x0;
int i, k;
x = (double *)malloc(sizeof(long double) * N);
if(x == NULL){
printf("mallocに失敗\n");
return -1;
}
for(i=0 ; i<N ; i++){
x=0.0;
}
x[0] = 1; a = 61; c = 49;
x0 = x[0];
for(i=2 ; i<=N ; i++){
x0 = mkrandom(a, c, x0);
x[i-2] = x0 / (double) 4294967296;
}
for(k = 1; k <= 10; k++){
p[k-1] = 0.0;
sigpk = 0.0;
for(i=1; i<=N-k ; i++){
sigpk += (double)x[i-2]*x[i-2 +k];
p[k-1] = 12.0/N*sigpk - 3;
}
}
for(k = 1; k <= 10; k++){
t = sqrt(N-2)*p[k-1]/sqrt(1 - pow(p[k-1], 2));
printf("P_%d = %f, t = %f", k, p[k-1], t);
if(t < 2.326){
printf(" --> 受容");
}
else{
printf(" --> 棄却");
}
printf("\n");
}
free(x);
return 0;
}
unsigned long mkrandom(unsigned long a, unsigned long c, unsigned long x0){
return a*x0 + c;
}
↓(一部分ですみません・・・)だけを実行すると、失敗にならなかったので、メモリは確保できると思うのですが。。
x = (double *)malloc(sizeof(long double) * N);
if(x == NULL){
printf("mallocに失敗\n");
return -1;
}
どなたかお願いします!m(__)m
メモリが確保できていない??
Re:メモリが確保できていない??
実行時のエラーの件とは無関係かもしれませんが、 気になる点がいくつかあります。 > unsigned long mkrandom(unsigned long a, unsigned long c, unsigned long x0); これでもコンパイルは通りますが、プロトタイプ宣言はmain()の外に書くのが より一般的ではないかと思います。 > x = (double *)malloc(sizeof(long double) * N); double型でなくlong double型の領域が必要な理由は何ですか? > for(i=1; i<=N-k ; i++){ > sigpk += (double)x[i-2]*x[i-2 +k]; iが1のとき、x[i-2]は定義した領域の範囲外になってしまいます。 > p[k-1] = 12.0/N*sigpk - 3; iに関するループの中で、毎回p[k-1]を計算する必要はありますか? ソースコードを貼り付ける際、最初と最後を <pre>タグと</pre>タグではさんでください(不等号は半角で)。
Re:メモリが確保できていない??
>これでもコンパイルは通りますが、プロトタイプ宣言はmain()の外に書くのが
より一般的ではないかと思います。
授業のテキストに書いてあったのでそのまま書いてしまいました。そうなんですね!!
>double型でなくlong double型の領域が必要な理由は何ですか?
確保されていないのではないかと思ってlong doubleを試して、そのままでした。。
>iが1のとき、x[i-2]は定義した領域の範囲外になってしまいます。
そうですね!!
そこを直したところ正常に実行されました!
ありがとうございます!
>iに関するループの中で、毎回p[k-1]を計算する必要はありますか?
そこも修正しました!
自分でやっているときは全く気にしなかったです。。ダメですね・・・
>ソースコードを貼り付ける際、最初と最後を
<pre>タグと</pre>タグではさんでください(不等号は半角で)。
注意書きを読んだのにすっかり忘れていました!すみません!
今度からは気をつけます。
ありがとうございました!
より一般的ではないかと思います。
授業のテキストに書いてあったのでそのまま書いてしまいました。そうなんですね!!
>double型でなくlong double型の領域が必要な理由は何ですか?
確保されていないのではないかと思ってlong doubleを試して、そのままでした。。
>iが1のとき、x[i-2]は定義した領域の範囲外になってしまいます。
そうですね!!
そこを直したところ正常に実行されました!
ありがとうございます!
>iに関するループの中で、毎回p[k-1]を計算する必要はありますか?
そこも修正しました!
自分でやっているときは全く気にしなかったです。。ダメですね・・・
>ソースコードを貼り付ける際、最初と最後を
<pre>タグと</pre>タグではさんでください(不等号は半角で)。
注意書きを読んだのにすっかり忘れていました!すみません!
今度からは気をつけます。
ありがとうございました!