Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] problema con la gestione di memoria e array

    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;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    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?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Un libro sul linguaggio C
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.