Parità e tolleranze in virgola mobile

Il confronto di due numeri in virgola mobile con qualcosa come a_float == b_float sta cercando problemi dato che a_float / 3.0 * 3.0 potrebbe non essere uguale a a_float causa di un errore irreversibile.

Quello che si fa normalmente è qualcosa come fabs(a_float - b_float) < tol .

Come si calcola tol ?

Idealmente la tolleranza dovrebbe essere appena più grande del valore di una o due delle figure meno significative. Quindi se il numero a virgola mobile di precisione singola è utilizzare tol = 10E-6 dovrebbe essere corretto. Tuttavia questo non funziona bene nel caso generale in cui a_float potrebbe essere molto piccolo o potrebbe essere molto grande.

Come si calcola il tol correttamente per tutti i casi generali? Sono interessato in particolare ai casi C o C ++.