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?


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? :)


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.