Aby bezpośrednio odpowiedzieć na twoje pytanie, chcesz użyć tego terminu epsilon
. Mówiąc dokładniej, jest to machine epsilon
jednak powszechne użycie porzuca „maszynę” i po prostu używa epsilon
.
Przeglądając moją lokalną kopię float.h
, widzę:
#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 */
A powiązane komentarze wyjaśniają, że epsilon jest terminem, o którym mówisz.
Ale możemy również polegać na innych zewnętrznych odnośnikach, aby sprawdzić, czy epsilon
jest to poprawny termin. Zobacz tutaj , tutaj , tutaj , a na koniec ta kombinacja znaczników zapytania SO . Nie byłem w stanie znaleźć bezpośredniego odniesienia do normy IEEE 754.
Nie pytałeś, ale znalazłem to odniesienie, które jest bardzo istotne w podanym przez ciebie przykładzie w celu wyjaśnienia twojego pytania.
Przeczytaj ten artykuł na blogu autorstwa Bruce'a Dawsona z Valve na temat porównywania wartości zmiennoprzecinkowych, aby uzyskać wgląd w to, dlaczego nie chcesz używać sugerowanego porównania.
W tym artykule znajduje się sporo informacji, ale jest to najbardziej odpowiedni fragment:
Jeśli porównywanie liczb zmiennoprzecinkowych pod kątem równości jest złym pomysłem, to co powiesz na sprawdzenie, czy ich różnica mieści się w granicach błędu lub wartości epsilon, na przykład:
bool isEqual = fabs(f1 – f2) <= epsilon;
Dzięki tym obliczeniom możemy wyrazić koncepcję dwóch pływaków na tyle blisko, że chcemy uznać je za równe. Ale jaką wartość powinniśmy zastosować dla epsilon?
Biorąc pod uwagę powyższe eksperymenty, możemy ulec pokusie wykorzystania błędu w naszej sumie, która wynosiła około 1,19e-7f. W rzeczywistości istnieje nawet definicja w float.h z tą dokładną wartością i nazywa się FLT_EPSILON.
Wyraźnie to wszystko. Bogowie plików nagłówkowych mówili, a FLT_EPSILON to jedyny prawdziwy epsilon!
Tyle że to śmieci. Dla liczb od 1,0 do 2,0 FLT_EPSILON reprezentuje różnicę między sąsiednimi zmiennoprzecinkowymi. W przypadku liczb mniejszych niż 1,0 epsilon FLT_EPSILON szybko staje się zbyt duży, a przy wystarczająco małych liczbach FLT_EPSILON może być większy niż liczby, które porównujesz!
Dawson zastanawia się nad kilkoma innymi rozważaniami na temat zawiłości związanych z porównywaniem pływaków i radzeniem sobie z bardzo małymi wartościami takimi jak ta, więc zachęcam do przeczytania reszty jego postu.