PDA

Visualizza la versione completa : [C] problema con la gestione di memoria e array


hisoka993
24-11-2016, 18:05
Ciao a tutti, premetto che sono un dilettante e quindi mi verrò concessa un po di clemenza :)

Vi spiego il problema:

sto cercando di creare una versione basilare di una Simulazione Montecarlo. Prendo i numeri generati casualmente da un file txt e li inserisco in un vettore z. Poi compio altre operazioni che portano a termine la simulazione. Il problema principale è che la misura massima di elementi che riesco a leggere sono 10000. Purtroppo questo è un numero ridicolo per una simulazione MC.

Lascio qui il codice in modo che magari qualche anima buona possa aiutarmi. Sono bloccato da giorni oramai.


//
// BSMC.c
//
//
// Created by Federico Ricciardelli on 21/11/16.
//
//

#include <stdio.h>
#include <math.h>
#include <time.h>
#define max(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a > _b ? _a : _b; })

double z[1000000];

struct tm create_tm(int year, int month, int day){
struct tm my_time = { .tm_year=year, .tm_mon=month, .tm_mday=day,
.tm_hour=0, .tm_min=0, .tm_sec=0 };
return my_time;
}

void asset(int mod, double s0, double k, double sigma, double rf, double t,int nSteps, int nSim, double z[], double path[nSim][nSteps+1]){
double dt = t/nSteps;
for(int i=0; i<nSim; i++) path[i][0] = s0;
for(int i=0; i<nSim; i++){
for(int j=0; j<nSteps; j++){
if(mod==0) path[i][j+1] = path[i][j]*exp((rf-(pow(sigma, 2)/2))*dt+sigma*sqrt(dt)*z[i]);
if(mod==1) path[i][j+1] = path[i][j]*exp((rf-(pow(sigma, 2)/2))*dt+sigma*sqrt(dt)*(-z[i]));
}
}
return;
}


void insertToZeta(char* filename, int length, double z[length]){
FILE* file = fopen(filename, "r");
int i = 0;
while(i<length){
fscanf(file, "%lf", &z[i]);
i++;
}
return;
}


int main(){
int s0=100, k=100, t=1, nSim=1000000, nSteps=1;
double rf=0.01, sigma=0.4, discountPayOff[nSim], totalDiscount = 0.0, totalPath = 0.0;
double vc[nSim], path[nSim][nSteps+1], pathAV[nSim][nSteps+1] ,z[nSim];

time_t start = time(NULL);
insertToZeta("matlab_1mln.txt", nSim, z);
asset(0, s0, k, sigma, rf, t, nSteps, nSim, z, path);
int i;
for(i=0; i<nSim; i++){
discountPayOff[i] = max(path[i][1]-k, 0)*exp(-rf*t);
totalDiscount += discountPayOff[i];
}
double discountPayOffAvg = totalDiscount/nSim;
double variance1 = 0.0;
for ( i = 0; i < nSim; i++) variance1 += pow(discountPayOff[i],2) - pow(discountPayOffAvg,2);
double variance = variance1 / (nSim - 1);
double standardDeviation= sqrt(variance);
double lower = discountPayOffAvg - (1.96 * standardDeviation / sqrt(nSim));
double higher = discountPayOffAvg + (1.96 * standardDeviation / sqrt(nSim));
printf("Price: %.2f\n", discountPayOffAvg);
printf("Confidence interval: [%.2f - %.2f]\n", lower, higher);
printf("Wall time elapsed: %ld\n", (time(NULL)-start));

return 0;
}

oregon
25-11-2016, 09:37
Se allochi tutto in vettori locali alle funzioni lo spazio sullo stack si esaurirà molto presto.

Prova a rivedere il codice, allocando dinamicamente i vettori e gli array che ti servono in modo da utilizzare l'heap (e quindi tutta la memoria disponibile).

hisoka993
25-11-2016, 15:56
purtroppo non ho capito quasi nulla di quello che ai scritto :) c'è un libro, una dispensa, qualcosa su cui posso imparare? o anche solo degli esempi dove si vede la differenza tra fatto bene e fatto male come il mio?

oregon
26-11-2016, 00:26
Un libro sul linguaggio C

Loading