Errore di calcolo a metà del ciclo

di il
17 risposte

Errore di calcolo a metà del ciclo

Salve a tutti, è possibile che un codice all'interno di un ciclo for funzioni bene fino a un certo valore e poi dia risultati sbagliati? il codice è questo
int num = leggi_file(dati,50);
     cout << "Dati letti: " << num << endl;
  
        for(i = 0; i <= num; i=i+3)
        {
         Ta[i]=dati[i];
         It[i]=dati[i+1];
         S[i]=dati[i+2];      
        //stampa a video per verifica immisione dati
         cout << "Ta:"<<Ta[i] << endl; 
         loss_ave[i]=Ul*(Ti-Ta[i])*3600/(1000000);
         cout << "loss_ave:"<<loss_ave[i] << endl; 
         cout << "It:"<<It[i] << endl;
         cout << "S:"<<S[i] << endl;   
         
         
         if (S[i]<loss_ave[i]) qu[i]=0;
         else qu[i]=F_r*(S[i]-loss_ave[i]);
         cout<<"qu="<<qu[i]<<endl;
         }
fuori dal main ho definito la funzione di lettura del file. Ho controllato i numeri con la stampa a video e mi risultano corretti tranne quelli che sono il risultato di loss_ave da i=7. Grazie per l'aiuto

17 Risposte

  • Re: Errore di calcolo a metà del ciclo

    Ciao,
    secondo me dovresti postare tutto il codice, i dati che prendi in input e dovresti anche chiarire cosa ti aspetti in output (cioè il motivo per cui i risultati ti sembrano sbagliati). Altrimenti non credo che ci possiamo fare molto.

    PS. Non capisco quella cosa di i=7. Se parti dal valore i=0 e ad ogni iterazione lo incrementi di 3, non dovrebbe mai essere i=7.
  • Re: Errore di calcolo a metà del ciclo

    Questo è tutto il codice
    int leggi_file(double data[], int max)
       {
       int num = 0;
       ifstream f("daily data.txt");
    
       while(num < max)
       {
          f >> data[num];
          if(f.eof()) 
             break;
          num++;
       }
       return num;
    }
    
    int main()
    {
        int n=10, Ac=2;
         float Ul=8.0, F_first=0.841;
         float m=0.03, Ti=40, cp=4186;
         
         int i, j;
         float F_sec, F_r, Q_tot;
         float m_adim, A;
         
         double Ta[15], It[15], S[15], dati[50];
         double loss_ave[15], qu[15], eta[15];
         
         
         m_adim=((m*cp)/(Ac*Ul*F_first));
         A=-1/m_adim;
         F_sec=(m_adim*(1-exp(A)));
         F_r=(F_sec*F_first);
         printf("Fr=:%f\n",F_r);
         
         
         
         int num = leggi_file(dati,50);
         cout << "Dati letti: " << num << endl;
      
            for(i = 0; i <= num; i=i+3)
            {
             Ta[i]=dati[i];
             It[i]=dati[i+1];
             S[i]=dati[i+2];      
            //stampa a video per verifica immisione dati
             cout << "Ta:"<<Ta[i] << endl; 
             loss_ave[i]=Ul*(Ti-Ta[i])*3600/(1000000);
             cout << "loss_ave:"<<loss_ave[i] << endl; 
           // cout << "It:"<<It[i] << endl;
             cout << "S:"<<S[i] << endl;   
             
             
             if (S[i]<loss_ave[i]) qu[i]=0;
             else qu[i]=F_r*(S[i]-loss_ave[i]);
             cout<<"qu="<<qu[i]<<endl;
             }
             
    //         for (i=)
    
             
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    In pratica mi legge dei valori da un file fatto nel seguente modo:
    Ta It S
    -11 0.02 0.01
    -8 0.43 0.35
    -2 0.99 0.82
    2 3.92 3.29
    3 3.36 2.84
    6 4.01 3.39
    7 3.84 3.21
    8 1.96 1.63
    9 1.21 0.99
    7 0.05 0.04

    e me li salva nei rispettivi vettori. Il primo risultato sbagliato, a cui susseguono gli altri errori, è per Ta=8 poichè dai calcoli svolti a mano loss_ave=8*(40-8)*3600/1000000=0.92 mentre la stampa a video mi da come valore -0.259. Per i valori precedenti i calcoli fatti a mano coincidono con quelli ricavati con il codice. Grazie
  • Re: Errore di calcolo a metà del ciclo

    Arianna ha scritto:


    dai calcoli svolti a mano loss_ave=8*(40-8)*3600/1000000=0.92
    Infatti io ottengo proprio quel valore. Ti posto uno screenshot. Ho aggiunto qualche stampa per verificare la correttezza dei dati letti dal file, ma non ho modificato altro. Direi che il tuo codice funziona... A te dà risultati diversi?

  • Re: Errore di calcolo a metà del ciclo

    Si mi da un risultato diverso...ci sto impazzendo da due ore
    Allegati:
    14343_ca23f8b419c578c7e81243245fd3dcf1.png
    14343_ca23f8b419c578c7e81243245fd3dcf1.png
  • Re: Errore di calcolo a metà del ciclo

    Ti posto pari pari il codice che mi ha dato quel risultato. Prova così, anche se dubito.
    
    #include <iostream>
    #include <fstream>
    #include <cmath>
    #include <cstdlib>
    
    #define EXIT_SUCCESS 0
    
    using namespace std;
    
    int leggi_file(double data[], int max)
       {
       int num = 0;
       ifstream f("daily data.txt");
    
       while(num < max)
       {
          f >> data[num];
          if(f.eof())
             break;
          num++;
       }
       return num;
    }
    
    int main()
    {
        int n=10, Ac=2;
         float Ul=8.0, F_first=0.841;
         float m=0.03, Ti=40, cp=4186;
    
         int i, j;
         float F_sec, F_r, Q_tot;
         float m_adim, A;
    
         double Ta[15], It[15], S[15], dati[50];
         double loss_ave[15], qu[15], eta[15];
    
    
         m_adim=((m*cp)/(Ac*Ul*F_first));
         A=-1/m_adim;
         F_sec=(m_adim*(1-exp(A)));
         F_r=(F_sec*F_first);
         printf("Fr=:%f\n",F_r);
    
    
    
         int num = leggi_file(dati,50);
         cout << "Dati letti: " << num << endl;
    
            for(i = 0; i <= num; i=i+3)
            {
             Ta[i]=dati[i];
             It[i]=dati[i+1];
             S[i]=dati[i+2];
            //stampa a video per verifica immisione dati
             cout << "Ta:"<<Ta[i] << endl;
             cout << "It:"<<It[i] << endl;
             cout << "S:"<<S[i] << endl;
             loss_ave[i]=Ul*(Ti-Ta[i])*3600/(1000000);
             cout << "loss_ave:"<<loss_ave[i] << endl;
    
    
             if (S[i]<loss_ave[i]) qu[i]=0;
             else qu[i]=F_r*(S[i]-loss_ave[i]);
             cout<<"qu="<<qu[i]<<endl;
             }
    
    //         for (i=)
    
    
        //system("PAUSE");
        return EXIT_SUCCESS;
    }
    
  • Re: Errore di calcolo a metà del ciclo

    Ho copiato e incollato il tuo codice...esattamente i miei stessi risultati, continuo ad avere l'errore. Grazie comunque
  • Re: Errore di calcolo a metà del ciclo

    E' davvero molto strano. L'unica ipotesi che mi viene in mente riguarda la difficoltà di gestione di numeri troppo grandi, tipo quel 1000000. Anche perché passi tutto, però il risultato ti viene addirittura negativo, quindi sospetto qualche errore sui bit che rappresentano il numero, anche se la cosa mi sembra comunque strana.
    Che IDE usi? Quale sistema operativo?
  • Re: Errore di calcolo a metà del ciclo

    Ho un win7 e uso il Dev, che mi sta procurando non pochi problemi ad essere onesta.
  • Re: Errore di calcolo a metà del ciclo

    Arianna ha scritto:


    ...uso il Dev...


    No, DevC++ NON è una buona scelta. E' un progetto obsoleto e con molti difetti.
    Prova a installare Code::Blocks e riprova con quel codice.
  • Re: Errore di calcolo a metà del ciclo

    Installato e copiato codice sul nuovo IDE. Non ho più numeri negativi ma gli ultimi due valori (anziche gli ultimi tre) continuano ad essere sbagliati
  • Re: Errore di calcolo a metà del ciclo

    Il mistero si infittisce... Quindi il valore di cui parlavamo prima (il famoso 0.9216) ora è corretto ma gli ultimi due non lo sono?
    Una cosa che puoi provare è farti stampare ogni passaggio algebrico (somma, prodotto e divisione) per vedere qual è sbagliata, poi tentare di indovinare il perché. Io altre idee non ne ho...
  • Re: Errore di calcolo a metà del ciclo

    E' la moltiplicazione per Ul(inizializzato uguale a che non fa per gli ultimi due valori ma li moltiplica per 2.53...Ora per me è un mistero. Grazie del tempo che mi hai dedicato....forzerò al massimo quel valore, dato che è costante per questo codice, a essere otto. Anche se in qualche modo dovrò risolvere il problema perchè questo genere di cose continua a capitarmi (Andando avanti con il codice c'è una SEMPLICISSIMA SOMMA il cui risultato andando avanti con le iterazioni, dopo un po inizia a diminuire senza avere valori negativi) e io mi sento stupida. Grazie ancora davvero
  • Re: Errore di calcolo a metà del ciclo

    Intanto mi sembra che la for sia sbagliata (non i<=num ma i<num) e poi i vettori hanno 15 elementi mentre l'indice i va fino a 50 ... ovvio che hai problemi ...
  • Re: Errore di calcolo a metà del ciclo

    .....ora va, anche nei calcoli successivi....ma potrei capire perché? In teoria quei vettori dovrebbero essere riempiti con meno elementi prendendo un terzo degli elementi totali. Scusate davvero la mia ignoranza e grazie per l'aiuto
Devi accedere o registrarti per scrivere nel forum
17 risposte