(a) La quantità corretta di arrotondamenti dipende dal dominio del problema. Per esempio. potresti decidere che le linee entro 1 ° l'una dall'altra dovrebbero essere considerate parallele.
(b) La rappresentazione a virgola mobile pone un limite inferiore sull'arrotondamento necessario. La determinazione della propagazione dell'errore è un argomento ampio nel campo dell'analisi numerica .
Tutti i numeri a virgola mobile finiti hanno un predecessore e un numero successore. Questa "dimensione del gradino" tra numeri o "epsilon macchina" dipende dalla grandezza del numero, cioè è più piccola intorno a zero e cresce verso l'infinito positivo e negativo. Ma convenientemente, questo è un errore relativo costante. Per un doppio a 64 bit ci sono 53 bit significativi, che portano ad una dimensione relativa del passo di circa 2 ^ -52 = 2.22E-16 (la macchina epsilon è solitamente definita come la metà di quella).
Supponendo che i valori di input siano il più precisi possibile (ovvero il loro errore relativo è l'epsilon della macchina) è possibile tracciare i calcoli per vedere come si propagano questi errori. Per esempio. per un'aggiunta o sottrazione, è necessario aggiungere gli errori assoluti. Nota che ad es. sottraendo due valori simili potrebbe risultare in un valore che è nell'ordine del suo errore assoluto (cancellazione catastrofica). A volte è possibile riorganizzare i calcoli per evitare questo. Per una moltiplicazione o divisione, puoi aggiungere gli errori relativi.
È possibile utilizzare i risultati dell'analisi per calcolare limiti assoluti e relativi adeguati al runtime.
Come esempio semplicissimo, considera un test per l'uguaglianza di due numeri in virgola mobile a e b, nel presupposto che il loro errore sia epsilon della macchina. Un approccio semplice sarebbe quello di confrontare il float successivo e precedente, cioè prev(a) <= b && b <= next(a)
. Se i due numeri hanno errori arbitrari, questo è più difficile ma l'idea è la stessa: derivare limiti di errore assoluti e confrontare se l'area delimitata si sovrappone. Questo può essere fatto convenientemente confrontando la loro differenza, cioè abs(a - b) <= absolute_error
.
Per un trattamento completo dei confronti in virgola mobile, leggi link . Quella pagina discute anche quando è più appropriato contare gli ULP (numero di fluttuanti discreti tra due numeri) che trattare con epsilon della macchina.