venerdì, novembre 10, 2006

precisione numerica

I conti fatti dal calcolatore risentono di errori dovuti alla precisione limitata con la quale vengono effettuate le operazioni.
Ad esempio, utilizzando il file di test di questo post direttamente con la funzione cos o con la funzione funzione si ottengono stime differenti per il punto di minimo, in uno dei due casi:


ant:codice $ ./testminmaxMIB
minimo di cos(x) fra 0 e 4 :3.14162 3.14162
minimo di cos(x) fra 4 e 0 :3.14162 3.14144

I risultati differiscono meno della precisione richiesta all'algoritmo, quindi in questo caso l'effetto e' sotto controllo.
Per tener conto di effetti di questo genere, esempio, e' buona norma non utilizzare mai operatori di uguaglianza fra oggetti di tipo double, ma scegliere una soglia al di sotto della quale i due numeri sono considerati uguali:
// invece di questo:
if (doubleUno == doubleDue) std::cout << "i due numeri sono uguali\n" ;
// e' piu' sicuro usare questo:
double soglia = 0.00001 ;
if (fabs (doubleUno - doubleDue) < soglia) std::cout << "i due numeri sono uguali\n" ;

Questi effetti inattesi, inoltre, dipendono anche da quale computer sia stato utilizzato per eseguire lo stesso programma, dalle opzioni di compilazione, dal compilatore, insomma da variabili molto poco sotto controllo.

Nessun commento: