Dlaczego dokładność modułu zmiennoprzecinkowego ma znaczenie?

9

Większość dialektów Smalltalk implementuje obecnie naiwny niedokładny moduł pływający (fmod / reszta).
Właśnie to zmieniłem, aby poprawić Squeak / Pharo i ewentualnie inne przestrzeganie standardów Smalltalk (IEEE 754, ISO / IEC 10967), tak jak już to zrobiłem w przypadku innych operacji zmiennoprzecinkowych.

Jednak jeśli chodzi o przyjęcie tych zmian, spodziewam się, że przestrzeganie standardu nie wystarczy, aby przekonać moich rówieśników, więc wyjaśnienie, w jakich okolicznościach ta dokładność naprawdę miałaby znaczenie, bardzo by mi pomogło. Do tej pory nie mogłem znaleźć dobrego przykładu.

Czy ktoś tu wie, dlaczego / kiedy / gdzie (w którym algorytmie) taka dokładność modułu miałaby mieć znaczenie?

aka.nice
źródło
Myślę, że możesz uzyskać lepsze odpowiedzi na temat obliczeń, ponieważ takie problemy są ważniejsze w ich (pod) domenie. W każdym razie pytanie jest tutaj tematyczne i powinieneś dać naszym odpowiedziom kilka dni przed ponownym opublikowaniem.
Raphael
1
Widziałem kod polegający na dokładności fmod / modf, co sprawiło, że zadrżałam, ale możliwość, że język może odważyć się wdrożyć naiwny niedokładny moduł zmiennoprzecinkowy, wydaje się jeszcze bardziej przerażająca. Przykładowy kod: (1) Weź resztę. (2) Zatrzymaj, jeśli wynosi zero. (3) Pomnóż to przez 2 i przejdź do (1). Podczas tego procesu można wykonać pożyteczną pracę, ale najważniejsze jest to, że zakończenie tego procesu zależy od dokładności reszty i dokładności pomnożenia przez 2. Nie jestem pewien, czy powinienem udzielić tu pełniejszej odpowiedzi, ponieważ nauki obliczeniowe wydają się bardziej odpowiednie na to pytanie.
Thomas Klimpel
Jedno przypuszczenie: normalizacja wejścia funkcji trygonometrycznej.
Paul A. Clayton
@ThomasKlimpel Jestem zainteresowany, jeśli znajdziesz referencje. Zauważ, że naiwna reszta jest zdefiniowana jako (x - ((y / x) obcięty * x)) z zaokrągleniem IEEE do najbliższych parzystych operacji, możemy udowodnić, że exactRem (x, y) == 0 => naiveRem (x, y) == 0. Problem jest odwrotny - fałszywy podział dokładny dodatni - jak naiwnyRem (4.0,0.1) == 0,0, co niestety w wielu przypadkach odpowiada naiwnym oczekiwaniom!
aka.nice
@ PaulA.Clayton tak, ponieważ sinus w stopniach może ... Choć przypuszczam, że naiwne rem działa równie dobrze, jak rem rem do ok. 1e16 stopni, ponieważ 360 ma ustawiony tylko zakres 6 bitów, a ponieważ podział przez 360 wydaje się nigdy nie zaokrąglać w górę dla poprzedników wielokrotności 360 ... W przypadku radianów przyzwoita biblioteka wymaga wielu precyzji, wykonuje dokładne rem ograniczanie do podwójnej precyzji naprawdę pomaga w takim przypadku?
aka.nice

Odpowiedzi:

1

Pamiętaj, że niedokładna implementacja zmiennoprzecinkowa wpływa na pogodę.

Przeprowadzono testy z prognozami pogody z takimi samymi danymi wejściowymi na innym sprzęcie, a prognozy były rozbieżne. Jeśli używasz algorytmu iteracyjnego, mała różnica w zaokrągleniu tutaj lub może spowodować efekt motyla zmieniający światło słoneczne w deszcz.

Zasady zaokrąglania w normach (IEEE 754, ISO / IEC 10967) zostały dokładnie przemyślane, dzięki czemu algorytmy numeryczne zachowują przewidywalność z największą dokładnością i za każdym razem odtwarzają ten sam wynik. Nieprzestrzeganie standardowych algorytmów numerycznych zaprojektowanych dla tych reguł zaokrąglania ulegnie awarii, a algorytmy iteracyjne, takie jak prognozy pogody, mogą nawet dać losowy wynik.

(i czy to nie mówi coś o prognozach pogody? :)

Goswin von Brederlow
źródło
1
Z drugiej strony, jeśli efekt motyla zmienia światło słoneczne w deszcz, twoje wyniki i tak nie były przydatne.
gnasher729
Dawno, dawno temu zapisałem dane zmiennoprzecinkowe w ASCII z niewystarczającą liczbą cyfr. Jeden klient chciał mi pokazać problem, ale po przywróceniu danych z pliku ASCII problem zniknął. Powiedziałem, że kilka wrzodów nie powinno mieć znaczenia, jeśli jego problem byłby źle uwarunkowany, i tak nic nie mogę zrobić. Powiedział, że to jego sprawa, moim jest dostarczanie oprogramowania umożliwiającego powtarzalność jego własnych problemów. On miał rację.
aka.nice
Dlatego powinieneś wypisywać liczby zmiennoprzecinkowe dla zapisów jako wartości szesnastkowe za pomocą% a.
Goswin von Brederlow,