メモリが確保できていない??
Posted: 2007年5月07日(月) 19:04
算術乱数の和を、プログラムの途中で求めているのですが、
確保するメモリを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
確保するメモリを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