Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

[C++] Errore di calcolo

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] [C++] Errore di calcolo

Messaggioda Foto UtenteManu18life » 6 feb 2013, 11:41

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 :-)
Avatar utente
Foto UtenteManu18life
10 3
 
Messaggi: 30
Iscritto il: 20 gen 2013, 14:46

0
voti

[2] Re: [C++] Errore di calcolo

Messaggioda Foto UtenteTardoFreak » 6 feb 2013, 12:02

Manca il sorgente.
Metti il sorgente fra i tag "Code"
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[3] Re: [C++] Errore di calcolo

Messaggioda Foto UtenteManu18life » 6 feb 2013, 12:13

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;
}
Avatar utente
Foto UtenteManu18life
10 3
 
Messaggi: 30
Iscritto il: 20 gen 2013, 14:46

0
voti

[4] Re: [C++] Errore di calcolo

Messaggioda Foto UtenteDirtyDeeds » 6 feb 2013, 12:18

Questa e le seguenti:

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


non sono assegnazioni.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[5] Re: [C++] Errore di calcolo

Messaggioda Foto UtenteManu18life » 6 feb 2013, 12:20

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:
Avatar utente
Foto UtenteManu18life
10 3
 
Messaggi: 30
Iscritto il: 20 gen 2013, 14:46

0
voti

[6] Re: [C++] Errore di calcolo

Messaggioda Foto UtenteTardoFreak » 6 feb 2013, 12:23

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.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[7] Re: [C++] Errore di calcolo

Messaggioda Foto UtenteDirtyDeeds » 6 feb 2013, 12:25

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.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[8] Re: [C++] Errore di calcolo

Messaggioda Foto UtenteManu18life » 6 feb 2013, 12:26

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:
Avatar utente
Foto UtenteManu18life
10 3
 
Messaggi: 30
Iscritto il: 20 gen 2013, 14:46

0
voti

[9] Re: [C++] Errore di calcolo

Messaggioda Foto UtenteManu18life » 6 feb 2013, 12:28

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.
Avatar utente
Foto UtenteManu18life
10 3
 
Messaggi: 30
Iscritto il: 20 gen 2013, 14:46

0
voti

[10] Re: [C++] Errore di calcolo

Messaggioda Foto UtenteTardoFreak » 6 feb 2013, 12:30

Domanda: perché usi variabili float e non double? :-M
Hai problemi di RAM, dove gira questo programma, su un micro o su un PC?
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

Prossimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti