Vai al contenuto

Arrotondamento valori REAL nei calcoli

Home Forum Programmazione IEC 61131 (LogicLab) Arrotondamento valori REAL nei calcoli

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #74087
    Anonimo
    Inattivo

    La richiesta nasce da problemi di calcolo media mobile di un valore di peso. Ho utilizzato il programma:

    VAR
        Weigth : REAL; (* Weigth *)
        WeigthAvg : REAL; (* Weigth average *)
    END_VAR
    
        WeigthAvg:=(Weigth*0.01)+(WeigthAvg*0.99);

    Con valori di peso come 22085.2, il risultato si avvicina a quanto atteso ma si “blocca” ad una certa distanza, forse la REAL raggiunge il limite (non ho fatto calcoli) quindi ho provato con valori LREAL.

        WeigthAvg:=(TO_LREAL(Weigth)*TO_LREAL(0.01))+(TO_LREAL(WeigthAvg)*TO_LREAL(0.99));

    Ma anche in questo caso il valore si “blocca” ad una certa distanza, m’è venuto il dubbio che l’implementazione dei calcoli adotti un appoggio real che tronca i calcoli.

    #74091
    Sergio Bertana
    Amministratore del forum

    Ho dato una occhiata al tuo programma, con un valore di peso di 22085.2 i calcoli in REAL ritornano un valore di media di  22085.080 con un errore di 0,12. I calcoli in LREAL ritornano un valore di media di 22085.123 con un errore di 0,077.

    Se se fai una verifica di conversione dati da decimali a REAL IEE754 usando un calcolatore On-line, vedrai che già il valore 22085.2 in REAL corrisponde a 22085.19921875 con un errore di -0.00078125. Lo stesso arrotondamento si avrà per altri valori in gioco e quindi le operazioni eseguite su valori di partenza che già differiscono dal valore originale produrranno un errore.

    Nella tua soluzione con numeri LREAL solo i valori definiti (0,01 e 0,99) sono stati effettivamente convertiti in LREAL per le variabili hai solo convertito il valore REAL già con arrotondamento  ecco quindi che il risultato è un pò migliorato ma non è perfetto. Se usi questo programma vedrai che il risultato sarà perfetto.

    VAR
        Weigth : LREAL;  (* Weigth *)
        WeigthAvg : LREAL; (* Weigth average *)
    END_VAR
    
        WeigthAvg:=(Weigth*LREAL#0.01)+(WeigthAvg*LREAL#0.99);
Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.