Obliczanie liczb rzeczywistych: zmiennoprzecinkowy vs TTE vs teoria domen vs itd
19
Obecnie obliczanie liczb rzeczywistych w najpopularniejszych językach jest nadal wykonywane za pomocą operacji zmiennoprzecinkowych. Z drugiej strony, teorie takie jak efektywność typu drugiego (TTE) i teoria domen od dawna obiecują dokładne obliczenie rzeczywistych liczb. Najwyraźniej problem precyzji zmiennoprzecinkowej nie zmniejszył się, więc dlaczego te teorie nie stały się bardziej popularne i dlaczego nie ma ich bardziej widocznych implementacji?
Na przykład, czy istnieją domeny aplikacji, w których nie dbamy o błędy zmiennoprzecinkowe? Czy istnieją poważne obawy dotyczące złożoności?
Pracuję w obliczeniach na liczbach rzeczywistych i chciałbym znać prawdziwą odpowiedź. Ale mogę spekulować. Myślę, że to problem socjologiczny.
Społeczność ludzi, którzy pracują nad prawdziwą arytmetyką, składa się z teoretyków, którzy nie są przyzwyczajeni do tworzenia oprogramowania. Zwykle więc przekazują uczniom zadanie wdrożenia (godnym uwagi wyjątkiem jest iRRAM Norberta Müllera ) lub mają własne implementacje zabawek .
Ludzie, którzy zrobienia posiadają niezbędną programowanie mojo nie posiadają niezbędne teoretyczne. Bez solidnej podstawy teoretycznej trudno jest poprawnie zaprojektować dokładną prawdziwą arytmetykę. Na przykład błędem jest dodawanie wielu liczb rzeczywistych w forpętli, ponieważ osiągniesz niedopuszczalną wydajność z powodu utraty precyzji. Jeśli chcesz dodać wiele reali, powinieneś zrobić to z drzewiastą strukturą, biorąc pod uwagę wielkości sum częściowych. Inną rzeczą, która jest trudne do uzyskania w poprzek jest to, że <i =tak ogólnej funkcji logicznej na Real po prostu nie istnieją (można mieć =, ale to albo zwrotu falselub odbiega i <rozchodzi po podaniu dwóch równych Real).
Wreszcie, nie jest wcale jasne, czy wiemy, jak zaimplementować biblioteki dla dokładnej prawdziwej arytmetyki. Nie są to zwykłe fragmenty bibliotek, które po prostu definiują niektóre typy danych i niektóre funkcje na nich. Często dokładna prawdziwa arytmetyka wymaga specjalnych trybów kontroli. Na przykład, iRRAM przejmuje główne wykonanie programu (dosłownie przejmuje kontrolę main), a także standardowe wejście i wyjście, dzięki czemu może ponownie uruchomić program, gdy nastąpi utrata precyzji. Moja biblioteka prawdziwej arytmetyki w Haskell dzieje się w Stagedmonadzie (która jest w zasadzie Readermonadą). Większość ludzi oczekuje, że liczby rzeczywiste będą „tylko kolejnym typem danych”, ale mam co do tego wątpliwości.
Jestem prawie całkowicie obeznany z dokładną prawdziwą arytmetyką, ale czy nie można zastosować w niej sumowania Kahana?
jjg
1
Hmm, nie sądzę. Pomyśl o dokładnej prawdziwej arytmetyce jako o arytmetyce przedziałowej, która automatycznie dostosowuje pośrednią precyzję, aby osiągnąć pożądaną dokładność wyjściową.
Andrej Bauer,
3
Oprócz braku zrozumienia przez programistów faktu, że liczby rzeczywiste są nieskończonymi obiektami i jego konsekwencji dla tego, co można zrobić programowo, myślę, że brak wsparcia sprzętowego jest również ważny. Trudno jest przekonać ludzi do użycia czegoś ze znacznym czasem i narzutem pamięci tylko dla poprawności.
Kaveh
1
Widziałem, że istnieje pewna aktywność we wdrażaniu prawdziwych obliczeń z typami koindukcyjnymi. Wydaje mi się, że poprawne typy koindukcyjne są nadal dość trudne (z pewnością nie jestem ekspertem w tej dziedzinie), ale czy sądzisz, że to obiecuje szersze zastosowanie dokładnych obliczeń?
SorcererofDM
3
Każda implementacja, która wykorzystuje strumienie cyfr lub cokolwiek innego, co ma stały współczynnik konwergencji, jest od samego początku niepełnosprawna, ponieważ będzie konwergować zbyt wolno. Ponadto implementacje oparte na strumieniu zmuszają użytkownika do obliczenia wszystkich poprzednich aproksymacji w celu uzyskania następnej, co również jest błędem projektowym.
Andrej Bauer,
10
Ogólnie rzecz biorąc, ludzie zawsze dbają o błędy zmiennoprzecinkowe. Jednak nie zgadzam się z Andrejem i nie sądzę, że zmiennoprzecinkowe są preferowane w porównaniu z rzeczywistością o dowolnej precyzji (w większości) z powodów socjologicznych.
Uważam, że głównym argumentem przeciwko dokładnemu obliczeniu rzeczywistych jest wydajność . Krótka odpowiedź brzmi: zawsze , gdy wydajność jest ważniejsza niż precyzja, warto użyć liczb zmiennoprzecinkowych .
Przypomina nam się zastosowanie obliczeniowej dynamiki płynów do projektowania aerodynamiki samochodów lub samolotów, w których niewielkie błędy w obliczeniach można łatwo uzupełnić dzięki astronomicznym korzyściom wynikającym z zastosowania dedykowanych jednostek zmiennoprzecinkowych występujących w wielu szeroko rozpowszechnionych procesorach.
W szczególności problem reprezentowania szerokiego zakresu liczb rzeczywistych przy użyciu stałej liczby bitów nie jest tak trywialny, jak mogłoby się wydawać na pierwszy rzut oka. W symulacji numerycznej wartości mogą się znacznie różnić (np. Gdy występują turbulencje), więc obliczenia w punkcie stałym nie są odpowiednie.
Nawet jeśli sprzęt nie ustala precyzji, użycie dowolnych liczb dokładności może być kilka rzędów wielkości wolniejsze niż użycie liczb zmiennoprzecinkowych. W rzeczywistości, nawet w ładnym przypadku, gdy wszystkie liczby są racjonalne, proste operacje, takie jak odwracanie macierzy, mogą skutkować dużymi, trudnymi do kontrolowania mianownikami (patrz tutaj przykład). Wiele dużych pakietów optymalizacji liniowej wykorzystuje zmiennoprzecinkowe z odpowiednimi trybami zaokrąglania, aby znaleźć przybliżone rozwiązania z tego właśnie problemu (patrz na przykład większość programów tutaj znalezionych ).
czy istnieją jakieś udowodnione luki między jakąś formą dokładnego obliczenia rzeczywistego a obliczeniem zmiennoprzecinkowym?
SorcererofDM
1
Obawiam się, że nie o tym wiem. Sean Gao ma kilka interesujących wyników dotyczących złożoności przybliżonych procedur decyzyjnych w odniesieniu do rzeczywistych (patrz streszczenie swojej pracy ) i oczywiście mianownik w odwrotności macierzy rośnie w najgorszym stopniu, jak jej wyznacznik .
cody
-6
Nie jestem ekspertem, ale szlifowałem to w ciągu ostatnich kilku lat. Problem polega na tym, że „rzeczywiste” liczby po prostu nie istnieją w taki sam sposób jak liczby natrualne. Czy jest ktoś, kto intuicyjnie rozumie „ -ness”? Zasadniczo liczby rzeczywiste są określone przez różne procesy graniczne; wiele z tych procesów granicznych otrzymało specjalne nazwy, a niektóre z nich są na tyle wyjątkowe, że tworzą znaczące podzbiory rzeczywistości (np. liczby algebraiczne)π
Chodzi mi o to, że jeśli zamierzasz dokładnie obliczyć, musisz mieć symbole zastępcze dla nazw specjalnych, a także znane imiona naturals. W pewnym momencie będziesz chciał oszacować dokładną wartość, aby zastosować ją do czegoś w prawdziwym świecie. Jak się okazuje, o wiele bardziej efektywne jest zajmowanie się całym problemem jako przybliżeniem od samego początku, chyba że masz bardzo wyspecjalizowane potrzeby.
Oczywiście bardzo niewielu pracujących programistów myśli w ten sposób. Mówią sobie głównie: „Ojej, podwójność ma większą precyzję, niż mogłabym kiedykolwiek, równie dobrze mogłaby z niej skorzystać”, a przede wszystkim jest to najbardziej ekonomiczne podejście. Problem polega na tym, że większość programistów nie wie, jak rozpoznać, kiedy wpadają w kłopoty, ponieważ zestaw pływaków o podwójnej precyzji jest nieskończenie mniejszy niż ...R
Ogólnie rzecz biorąc, ludzie zawsze dbają o błędy zmiennoprzecinkowe. Jednak nie zgadzam się z Andrejem i nie sądzę, że zmiennoprzecinkowe są preferowane w porównaniu z rzeczywistością o dowolnej precyzji (w większości) z powodów socjologicznych.
Uważam, że głównym argumentem przeciwko dokładnemu obliczeniu rzeczywistych jest wydajność . Krótka odpowiedź brzmi: zawsze , gdy wydajność jest ważniejsza niż precyzja, warto użyć liczb zmiennoprzecinkowych .
Przypomina nam się zastosowanie obliczeniowej dynamiki płynów do projektowania aerodynamiki samochodów lub samolotów, w których niewielkie błędy w obliczeniach można łatwo uzupełnić dzięki astronomicznym korzyściom wynikającym z zastosowania dedykowanych jednostek zmiennoprzecinkowych występujących w wielu szeroko rozpowszechnionych procesorach.
W szczególności problem reprezentowania szerokiego zakresu liczb rzeczywistych przy użyciu stałej liczby bitów nie jest tak trywialny, jak mogłoby się wydawać na pierwszy rzut oka. W symulacji numerycznej wartości mogą się znacznie różnić (np. Gdy występują turbulencje), więc obliczenia w punkcie stałym nie są odpowiednie.
Nawet jeśli sprzęt nie ustala precyzji, użycie dowolnych liczb dokładności może być kilka rzędów wielkości wolniejsze niż użycie liczb zmiennoprzecinkowych. W rzeczywistości, nawet w ładnym przypadku, gdy wszystkie liczby są racjonalne, proste operacje, takie jak odwracanie macierzy, mogą skutkować dużymi, trudnymi do kontrolowania mianownikami (patrz tutaj przykład). Wiele dużych pakietów optymalizacji liniowej wykorzystuje zmiennoprzecinkowe z odpowiednimi trybami zaokrąglania, aby znaleźć przybliżone rozwiązania z tego właśnie problemu (patrz na przykład większość programów tutaj znalezionych ).
źródło
Nie jestem ekspertem, ale szlifowałem to w ciągu ostatnich kilku lat. Problem polega na tym, że „rzeczywiste” liczby po prostu nie istnieją w taki sam sposób jak liczby natrualne. Czy jest ktoś, kto intuicyjnie rozumie „ -ness”? Zasadniczo liczby rzeczywiste są określone przez różne procesy graniczne; wiele z tych procesów granicznych otrzymało specjalne nazwy, a niektóre z nich są na tyle wyjątkowe, że tworzą znaczące podzbiory rzeczywistości (np. liczby algebraiczne)π
Chodzi mi o to, że jeśli zamierzasz dokładnie obliczyć, musisz mieć symbole zastępcze dla nazw specjalnych, a także znane imiona naturals. W pewnym momencie będziesz chciał oszacować dokładną wartość, aby zastosować ją do czegoś w prawdziwym świecie. Jak się okazuje, o wiele bardziej efektywne jest zajmowanie się całym problemem jako przybliżeniem od samego początku, chyba że masz bardzo wyspecjalizowane potrzeby.
Oczywiście bardzo niewielu pracujących programistów myśli w ten sposób. Mówią sobie głównie: „Ojej, podwójność ma większą precyzję, niż mogłabym kiedykolwiek, równie dobrze mogłaby z niej skorzystać”, a przede wszystkim jest to najbardziej ekonomiczne podejście. Problem polega na tym, że większość programistów nie wie, jak rozpoznać, kiedy wpadają w kłopoty, ponieważ zestaw pływaków o podwójnej precyzji jest nieskończenie mniejszy niż ...R
źródło