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