Pagina 1 di 3

[C++] Errore di calcolo

MessaggioInviato: 6 feb 2013, 11:41
da Manu18life
Lo scopo del programma è una ricerca. Vi spiego brevemente il codice...
Carico dei valori (numeri costanti) in due matrici di tipo float dimensioni 10x5.
Eseguo una interpolazione lineare per riga per entrambe le tabelle, ciò significa che trovo i coefficienti della retta interpolante dei dati di ogni riga.
A partire da questa serie di coefficienti creo ulteriori due tabelle sempre di tipo float di dimensioni 10x400.
(In pratica i dati di riga rappresentano l'andamento di un fattore nel tempo, con l'interpolazione ho eseguito un aumento di "risoluzione" di tale andamento passando da intervalli di 6 mesi tra ogni dato di riga ad 1 settimana).
Fatto ciò dunque mi ritrovo con due tabelle 10x400.
Ogni valore della prima tabella dovrà essere moltiplicato per tutti i valori della seconda tabella.
Ne esce fuori dunque un numero di prodotti pari a 10*400*10*400= 16 milioni.
Ognuno di questi 16 milioni di prodotti (il risultato è float) deve essere confrontato con un valore dato in input (tipo float).

I problemi sono due:
1. se provo a stampare le tabelle 10x400 mi ritrovo dei valori inaspettati (ad esempio numeri negativi che non dovrebbero esserci)... E' possibile che un numero elevato di calcoli compromette la precisione operazionale? Oppure è solo un problema di stampa a video? (Se provo a stampare molti dati infatti oltre a dati non veritieri la stampa a video risulta troncata.)
2. Il dato che immetto da tastiera che deve essere cercato tra i 16 milioni di prodotti è di 3 cifre decimali, dunque dovrei troncare i 16 milioni di prodotti float a 3 cifre decimali per eseguire un confronto corretto... Come posso eseguire dunque il controllo "if" su solo 4 cifre significative?
Ad esempio il confronto if(0.123456789==0.125) deve diventare if(0.123==0.125)...

Sono sicuro che non ci sono errori concettuali.
Grazie a tutti :-)

Re: [C++] Errore di calcolo

MessaggioInviato: 6 feb 2013, 12:02
da TardoFreak
Manca il sorgente.
Metti il sorgente fra i tag "Code"

Re: [C++] Errore di calcolo

MessaggioInviato: 6 feb 2013, 12:13
da Manu18life
Codice: Seleziona tutto
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    float LLMF[7][5],LMF[9][5];
    float sLLMFx[7],mLLMFx[7],numLLMFx[7],denLLMFx[7],bLLMFx[7],aLLMFx[7];
    float sLMFx[9],mLMFx[9],numLMFx[9],denLMFx[9],bLMFx[9],aLMFx[9];
    float LLMFext[7][200],LMFext[9][200];
    float t[5],st=0,mt=0,text=0;
    float MF=0,MFctrl=0,tc=0,tr=0;
    int i=0,j=0,z=0,k=0,app=0,flag=0;
   
    // Inizializzazione
    for(i=0;i<7;i++)
    {
     sLLMFx[i]=0;
     mLLMFx[i]=0;
     numLLMFx[i]=0;
     denLLMFx[i]=0;
     bLLMFx[i]=0;
     aLLMFx[i]=0;
     sLMFx[i]=0;
     mLMFx[i]=0;
     numLMFx[i]=0;
     denLMFx[i]=0;
     bLMFx[i]=0;
     aLMFx[i]=0;
    }
   
   
   
   
   
    // Definizione dei tempi
   
    t[0]=1; t[1]=1.5; t[2]=2; t[3]=2.5; t[4]=3;
   
   
    // Caricamento LLMF CIE
   
    // Lampada HPS
    LLMF[0][0]==0.98;
    LLMF[0][1]==0.97;
    LLMF[0][2]==0.94;
    LLMF[0][3]==0.91;
    LLMF[0][4]==0.90;
    // Lampada MH
    LLMF[1][0]==0.82;
    LLMF[1][1]==0.78;
    LLMF[1][2]==0.76;
    LLMF[1][3]==0.74;
    LLMF[1][4]==0.73;
   // Lampada HPM
    LLMF[2][0]==0.87;
    LLMF[2][1]==0.83;
    LLMF[2][2]==0.80;
    LLMF[2][3]==0.78;
    LLMF[2][4]==0.76;
    // Lampada LPS
    LLMF[3][0]==0.98;
    LLMF[3][1]==0.96;
    LLMF[3][2]==0.93;
    LLMF[3][3]==0.90;
    LLMF[3][4]==0.87;
    // Lampada FD (Tph)
    LLMF[4][0]==0.95;
    LLMF[4][1]==0.94;
    LLMF[4][2]==0.93;
    LLMF[4][3]==0.92;
    LLMF[4][4]==0.91;
    // Lampada FD (Hph)
    LLMF[5][0]==0.82;
    LLMF[5][1]==0.78;
    LLMF[5][2]==0.74;
    LLMF[5][3]==0.72;
    LLMF[5][4]==0.71;
    // Lampada FS
    LLMF[6][0]==0.91;
    LLMF[6][1]==0.88;
    LLMF[6][2]==0.86;
    LLMF[6][3]==0.85;
    LLMF[6][4]==0.84;
   
    // Interpolazione
    // Aumento della risoluzione dei tempi per LLMF (estensione tabella)
    // Intervallo tempi: 4000 a 36000 ore
    // Risoluzione: 160 ore (circa 2 settimane)
         
    // Somma dei tempi
    for(i=0;i<5;i++)
    {
                        st=st+t[i];
    }
    // Media dei tempi
    mt=st/5;
   
    // Somma dei valori LLMF per tipo lampada
    for(j=0;j<7;j++)
    {
     for(i=0;i<5;i++)
     {
      sLLMFx[j]=sLLMFx[j]+LLMF[j][i];
     }
    // Media dei valori LLMF per tipo lampada
    mLLMFx[j]=sLLMFx[j]/5;
    }
   
    // Coefficienti rette interpolanti LLMF per tipo lampada
    for(j=0;j<7;j++)
    {
     for(i=0;i<5;i++)
     {
      numLLMFx[j]=numLLMFx[j]+(t[i]-mt)*(LLMF[j][i]-mLLMFx[j]);
      denLLMFx[j]=denLLMFx[j]+(t[i]-mt)*(t[i]-mt);
     }
    bLLMFx[j]=(numLLMFx[j]/5)/(denLLMFx[j]/5);
    aLLMFx[j]=mLLMFx[j]-bLLMFx[j]*mt;
    }
   
    // Calcolo tabella LLMF estesa (risoluzione di circa 2 settimane)
    for(j=0;j<7;j++)
    {
     for(i=0;i<200;i++)
     {
      text=0.04*(i+1);
      LLMFext[j][i]=aLLMFx[j]+bLLMFx[j]*text;
     }
    }
   
    //**************************************************************************
   
    // Caricamento LMF CIE
   
    // Apparecchio IP2X, High Pollution
    LMF[0][0]=0.53;
    LMF[0][1]=0.48;
    LMF[0][2]=0.45;
    LMF[0][3]=0.43;
    LMF[0][4]=0.42;
    // Apparecchio IP2X, Medium Pollution
    LMF[1][0]=0.62;
    LMF[1][1]=0.58;
    LMF[1][2]=0.56;
    LMF[1][3]=0.54;
    LMF[1][4]=0.53;
    // Apparecchio IP2X, Low Pollution
    LMF[2][0]=0.82;
    LMF[2][1]=0.80;
    LMF[2][2]=0.79;
    LMF[2][3]=0.78;
    LMF[2][4]=0.78;
    // Apparecchio IP5X, High Pollution
    LMF[3][0]=0.89;
    LMF[3][1]=0.87;
    LMF[3][2]=0.84;
    LMF[3][3]=0.80;
    LMF[3][4]=0.76;
    // Apparecchio IP5X, Medium Pollution
    LMF[4][0]=0.90;
    LMF[4][1]=0.88;
    LMF[4][2]=0.86;
    LMF[4][3]=0.84;
    LMF[4][4]=0.82;
    // Apparecchio IP5X, Low Pollution
    LMF[5][0]=0.92;
    LMF[5][1]=0.91;
    LMF[5][2]=0.90;
    LMF[5][3]=0.89;
    LMF[5][4]=0.88;
    // Apparecchio IP6X, High Pollution
    LMF[6][0]=0.91;
    LMF[6][1]=0.90;
    LMF[6][2]=0.88;
    LMF[6][3]=0.85;
    LMF[6][4]=0.83;
    // Apparecchio IP6X, Medium Pollution
    LMF[7][0]=0.92;
    LMF[7][1]=0.91;
    LMF[7][2]=0.89;
    LMF[7][3]=0.88;
    LMF[7][4]=0.87;
    // Apparecchio IP6X, Low Pollution
    LMF[8][0]=0.93;
    LMF[8][1]=0.92;
    LMF[8][2]=0.91;
    LMF[8][3]=0.90;
    LMF[8][4]=0.90;
   
   
    // Interpolazione
    // Aumento della risoluzione dei tempi per LMF (estensione tabella)
    // Intervallo tempi: 4000 a 36000 ore
    // Risoluzione: 160 ore (circa 2 settimana)
         
    // Somma dei tempi
    for(i=0;i<5;i++)
    {
                        st=st+t[i];
    }
    // Media dei tempi
    mt=st/5;
   
    // Somma dei valori LMF per combinazione apparecchio/livello inquinamento
    for(j=0;j<9;j++)
    {
     for(i=0;i<5;i++)
     {
      sLMFx[j]=sLMFx[j]+LMF[j][i];
     }
    // Media dei valori LMF per combinazione apparecchio/livello inquinamento
    mLMFx[j]=sLMFx[j]/5;
    }
   
    // Coefficienti rette interpolanti LMF per combinazione apparecchio/livello inquinamento
    for(j=0;j<9;j++)
    {
     for(i=0;i<5;i++)
     {
      numLMFx[j]=numLMFx[j]+(t[i]-mt)*(LMF[j][i]-mLMFx[j]);
      denLMFx[j]=denLMFx[j]+(t[i]-mt)*(t[i]-mt);
     }
    bLMFx[j]=(numLMFx[j]/5)/(denLMFx[j]/5);
    aLMFx[j]=mLMFx[j]-bLMFx[j]*mt;
    }
   
    // Calcolo tabella LMF estesa (risoluzione di circa 2 settimane)
    for(j=0;j<9;j++)
    {
     for(i=0;i<200;i++)
     {
      text=0.04*(i+1);
      LMFext[j][i]=aLMFx[j]+bLMFx[j]*text;
     }
    }
   
    //**************************************************************************
   
    // Ricerca Piani di manutenzione per MF dato in input
   
    cout<<"Inserisci MF (fino a 3 cifre decimali): ";
    cin>>MF;
    for(z=0;z<7;z++)
    {
     for(k=0;k<200;k++)
     {
      for(j=0;j<9;j++)
      {
       for(i=0;i<200;i++)
       {
        MFctrl=LLMFext[z][k]*LMFext[j][i];
        if(MF==MFctrl)
         {
          flag=1;
          tc=0.04*(i+1);
          tr=0.04*(k+1);
          cout<<"Tc (settimane): "<<tc<<" Tr (settimane): "<<tr;
          cout<<" Per lampada tipo: "<<(z+1)<<" app./liv. inquin.: "<<(j+1);
          cout<<endl<<endl;
         }
        }
       }
      }
     }
     if(flag==0)
     cout<<"NO PIANI MANUTENZIONE!";
     
   
   
    cout<<endl<<endl<<endl<<endl<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

Re: [C++] Errore di calcolo

MessaggioInviato: 6 feb 2013, 12:18
da DirtyDeeds
Questa e le seguenti:

Codice: Seleziona tutto
LLMF[0][0]==0.98;


non sono assegnazioni.

Re: [C++] Errore di calcolo

MessaggioInviato: 6 feb 2013, 12:20
da Manu18life
Non ricordavo come se vanno le parentesi quadre o tonde e il singolo uguale o il doppio :mrgreen:
E' da tanto che non scrivo... Come si fa l'assegnazione? :mrgreen:

Re: [C++] Errore di calcolo

MessaggioInviato: 6 feb 2013, 12:23
da TardoFreak
Ho dato un rapido sguardo.
Che vengano dei valori negativi è assai possibile.
Per esempio quando sottrai al tempo la media dei tempi o quando sottrai dai valori della lampada la media dei valori.

Re: [C++] Errore di calcolo

MessaggioInviato: 6 feb 2013, 12:25
da DirtyDeeds
Manu18life ha scritto:Non ricordavo come se vanno le parentesi quadre o tonde e il singolo uguale o il doppio :mrgreen:


Le parentesi non c'entrano, è il doppio uguale il problema.

Re: [C++] Errore di calcolo

MessaggioInviato: 6 feb 2013, 12:26
da Manu18life
DirtyDeeds ha scritto:
Manu18life ha scritto:Non ricordavo come se vanno le parentesi quadre o tonde e il singolo uguale o il doppio :mrgreen:


Le parentesi non c'entrano, è il doppio uguale il problema.


Ho corretto :ok:

Re: [C++] Errore di calcolo

MessaggioInviato: 6 feb 2013, 12:28
da Manu18life
TardoFreak ha scritto:Ho dato un rapido sguardo.
Che vengano dei valori negativi è assai possibile.
Per esempio quando sottrai al tempo la media dei tempi o quando sottrai dai valori della lampada la media dei valori.


Si è corretto ma non è possibile che mi escano valori 10^34...
Comunque resta il fatto che la stampa a video delle matrici risulta troncata.

Re: [C++] Errore di calcolo

MessaggioInviato: 6 feb 2013, 12:30
da TardoFreak
Domanda: perché usi variabili float e non double? :-M
Hai problemi di RAM, dove gira questo programma, su un micro o su un PC?