Porównuję teraz zmiennoprzecinkowe w Javie, a najprostszą formułą jest:
Math.abs(a - b) < THRESHOLD
Czy nazywając zmienną próg różnicy, powinieneś nazwać ją delta lub epsilon ? W szczególności, który z dwóch jest poprawnym terminem na najmniejszą wartość, którą może reprezentować liczba zmiennoprzecinkowa?
Czy termin jest specyficzny dla języka programowania, czy jest uniwersalny w różnych językach?
Odpowiedzi:
Epsilon w matematyce i inżynierii
Z matematyki i inżynierii w ogóle:
i epsilon wydaje się bardziej odpowiedni w twoim przypadku.
Epsilon w informatyce
W szczególności w informatyce termin epsilon odnosi się również do espilon maszynowy, który mierzy różnicę między
1.0f
najmniejszym pływakiem, który jest ściśle większy niż1.0f
. Ta ostatnia liczba dotyczy liczb1.00000011920928955078125f
zmiennoprzecinkowych w Javie i można ją obliczyć za pomocą:Definicja maszyny epsilon jest zgodna z ogólnym zastosowaniem epsilon opisanym powyżej.
Porównywanie pływaków
Zauważ jednak, że przed porównaniem pływaków pod kątem „bliskości”, musisz mieć pojęcie o ich skali. Dwa bardzo duże i rzekomo bardzo różne zmiennoprzecinkowe mogą być równe:
I odwrotnie, może być wiele możliwych wartości pływaka (i kilka rzędów wielkości) między dwoma małymi pływakami, które różnią się epsilon maszyny „tylko”. W poniższym przykładzie istnieje 10 000 000 dostępnych wartości zmiennoprzecinkowych między
small
if
, ale ich różnica jest nadal znacznie poniżej epsilon maszyny:Artykuł połączony w odpowiedzi GlenH7 bada dalej porównanie zmiennoprzecinkowe i proponuje kilka rozwiązań w celu przezwyciężenia tych problemów.
źródło
W matematyce delta jest używana do reprezentowania pewnej różnicy od wartości, epsilon jest używany do reprezentowania arbitralnej wartości błędu. W tym przypadku epsilon będzie konwencjonalną nazwą.
źródło
Aby bezpośrednio odpowiedzieć na twoje pytanie, chcesz użyć tego terminu
epsilon
. Mówiąc dokładniej, jest tomachine epsilon
jednak powszechne użycie porzuca „maszynę” i po prostu używaepsilon
.Przeglądając moją lokalną kopię
float.h
, widzę: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:
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.
źródło
simplest formula
. Wiele osób stosuje to podejście jako pierwszą próbę i dołączyłem artykuł Dawsona, ponieważ naprawdę wpada on w niuanse tego, jak trudne jest porównanie. Próbowałem więc bezpośrednio odpowiedzieć na pytanie, a następnie wskazać, dlaczego nie użyć go w ten sposób.To jest funkcja błędu; błąd bezwzględny jest zwykle nazywany ε (epsilon) lub Δ x dla pewnej ilości x:
Błąd względny jest czasem nazywany η (eta):
Do celów programowania
absoluteError
irelativeError
(lub niektóre ich skróty) są bardziej opisowe. Jeśli chcesz stwierdzić, że błąd jest mniejszy niż pewna wartość, wartość ta byłaby po prostu nazywana progiem lub tolerancją .Widzieć:
Błąd absolutny w Wolfram MathWorld
Błąd aproksymacji na Wikipedii
źródło
Nazwałbym to „tolerancją”.
Może nie jest to matematycznie poprawny termin, ale sam fakt, że zadajesz pytanie, sugeruje mi, że ani „delta”, ani „epsilon” nie byłyby dobrą nazwą zmiennej zmiennej.
Z mojego doświadczenia wynika, że lepiej jest używać nazw identyfikatorów, które mają sens dla tych, którzy faktycznie czytają kod. Co to za dobrze poprawna nazwa, jeśli oznacza, że czytelnik musi sprawdzić ją w Wikipedii, aby zrozumieć, co to znaczy?
źródło