Per rispondere direttamente alla tua domanda, vuoi usare il termine epsilon
. Più precisamente, è, machine epsilon
ma l'uso comune fa cadere "macchina" e usa solo epsilon
.
Guardando nella mia copia locale di float.h
vedo:
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define LDBL_EPSILON DBL_EPSILON /* smallest such that 1.0+LDBL_EPSILON != 1.0 */
E i commenti associati chiariscono che epsilon è il termine a cui ti riferisci.
Ma possiamo anche fare affidamento su alcuni altri riferimenti esterni per verificare che epsilon
sia il termine corretto. Vedi qui , qui , qui e infine questa combinazione di tag di query SO . Non sono riuscito a trovare un riferimento diretto allo standard IEEE 754 da citare.
Non me l'hai chiesto, ma ho trovato questo riferimento molto pertinente all'esempio che hai fornito per chiarire la tua domanda.
Dai un'occhiata a questo articolo del blog di Bruce Dawson di Valve sul confronto di valori in virgola mobile per alcune intuizioni sul perché non vuoi usare il confronto che hai suggerito.
Ci sono un sacco di informazioni racchiuse in quell'articolo, ma questo è lo snipppet più rilevante da lì:
Se confrontare float per uguaglianza è una cattiva idea, allora che ne dici di verificare se la loro differenza è all'interno di alcuni limiti di errore o valore epsilon, come questo:
bool isEqual = fabs(f1 – f2) <= epsilon;
Con questo calcolo possiamo esprimere il concetto di due galleggianti abbastanza vicini da volerli considerare uguali. Ma quale valore dovremmo usare per epsilon?
Data la nostra sperimentazione sopra, potremmo essere tentati di usare l'errore nella nostra somma, che era di circa 1,19e-7f. In effetti, c'è anche una definizione in float.h con quel valore esatto, e si chiama FLT_EPSILON.
Chiaramente questo è tutto. I file di intestazione che gli dei hanno parlato e FLT_EPSILON è l'unico vero epsilon!
Solo che è spazzatura. Per i numeri tra 1.0 e 2.0 FLT_EPSILON rappresenta la differenza tra i float adiacenti. Per numeri inferiori a 1,0 un epsilon di FLT_EPSILON diventa rapidamente troppo grande e con numeri abbastanza piccoli FLT_EPSILON potrebbe essere più grande dei numeri che stai confrontando!
Dawson analizza alcune altre considerazioni sulle complessità coinvolte quando si confrontano i galleggianti e si affrontano valori molto piccoli come questo, quindi incoraggio la lettura del resto del suo post.