Oggi stavo esaminando un po 'di codice C ++ (scritto da qualcun altro) e ho trovato questa sezione:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
Sto cercando di capire se questo ha persino senso.
La documentazione per epsilon()
dice:
La funzione restituisce la differenza tra 1 e il valore più piccolo maggiore di 1 che è rappresentabile [da un doppio].
Questo vale anche per 0, ovvero epsilon()
il valore più piccolo è maggiore di 0? Oppure ci sono numeri tra 0
e 0 + epsilon
che possono essere rappresentati da un double
?
In caso contrario, il confronto non è equivalente a someValue == 0.0
?
numeric_limits<>::epsilon
è fuorviante e irrilevante. Ciò che vogliamo è assumere 0 se il valore effettivo differisce di non più di alcuni ε da 0. E ε dovrebbe essere scelto in base alla specifica del problema, non a un valore dipendente dalla macchina. Sospetto che l'attuale epsilon sia inutile, poiché anche solo alcune operazioni del programma quadro potrebbero accumulare un errore maggiore di quello.