Devo calcolare l'errore quadratico medio di un'operazione a 16 bit per un numero arbitrario di punti dati (verso l'alto di 100 milioni). Ho deciso di utilizzare una media costante, quindi non dovrei preoccuparmi di un overflow dovuto all'aggiunta di un numero elevato di errori al quadrato. A 100 milioni di campioni ho avuto problemi con la precisione in virgola mobile (risultati inaccurati), quindi mi sono trasferito al raddoppio.Mantenimento della precisione di virgola mobile con una media mobile
Ecco il mio codice
int iDifference = getIdeal() - getValue();
m_iCycles++;
// calculate the running MSE as
// http://en.wikipedia.org/wiki/Moving_average
// MSE(i + 1) = MSE(i) + (E^2 - MSE(i))/(i + 1)
m_dMSE = m_dMSE + ((pow((double)iDifference,2) - m_dMSE)/(double)m_iCycles);
Esiste un modo migliore per implementare questo per mantenere la precisione? Ho considerato di normalizzare il MSE a uno e semplicemente di mantenere una somma con una divisione finale al completamento per calcolare la media.
Come nota a lato del tutto, a seconda se si prende in mano il 'pow (double, int)' sovraccarico, 'iDifference * iDifference' potrebbe essere ordini di grandezza più veloce rispetto alla chiamata' pow'. –
concordato. Avrei dovuto prenderlo. Grazie Marco! –