Podczas badania dokładności liczb zmiennoprzecinkowych widziałem w kilku miejscach zdanie podobne do
„liczba zmiennoprzecinkowa i liczba podwójna są ( zaprojektowane / wykorzystywane często ) w obliczeniach inżynierskich i naukowych ”
Z mojego zrozumienia wynika, że siła liczb zmiennoprzecinkowych i podwójnych to ilość pamięci, jakiej używają ze względu na (dobrą, ale nie idealną) precyzję.
Wydaje mi się, że prawie rozumiem tę odpowiedź
„liczby zmiennoprzecinkowe pozwalają modelować wielkości ciągłe”
Nadal nie jestem przekonany, że rozumiem. Zarówno inżynieria, jak i nauka brzmią jak pola, w których chciałbyś uzyskać dokładne wyniki swoich obliczeń, których, moim zdaniem , zmiennoprzecinkowe nie dają. Nie jestem również pewien, czy dokładnie rozumiem, czym jest „ciągła ilość”.
Czy ktoś może rozwinąć to wyjaśnienie i być może podać przykład?
źródło
Engineering and Science both sound like fields where you would want precise results from your calculations, which, from my understanding, floating points do not give.
Zarówno w nauce, jak i inżynierii zależy Ci na precyzji tylko do pewnego momentu. Stosowanie nieskończonej precyzji do każdego obliczenia jest często niepotrzebnie kosztowne. To, co odróżnia zmiennoprzecinkowy od stałego punktu, to to, że nie musisz zatwierdzać do określonej liczby miejsc po przecinku - możesz mieć naprawdę małe ilości z dużą liczbą miejsc po przecinku lub naprawdę duże ilości z ograniczoną precyzją.Odpowiedzi:
Obliczenia w nauce i inżynierii wymagają kompromisów w zakresie precyzji, zasięgu i prędkości. Arytmetyka punktów stałych zapewnia precyzję i przyzwoitą prędkość, ale zmniejsza zasięg. BigNum, biblioteki o dowolnej precyzji, wygrywają w zakresie zasięgu i precyzji, ale tracą szybkość.
Sedno sprawy polega na tym, że większość obliczeń naukowych i inżynieryjnych wymaga dużej prędkości i dużego zasięgu, ale ma stosunkowo niewielkie potrzeby precyzji. Najbardziej dobrze określona stała fizyczna znana jest tylko z około 13 cyfr, a wiele wartości jest znanych z dużo mniejszą pewnością. Posiadanie więcej niż 13 cyfr precyzji na komputerze nie pomoże. Mucha w maści polega na tym, że sekwencje operacji zmiennoprzecinkowych mogą stopniowo tracić precyzję. Chleb i masło analizy numerycznej ustalają, które problemy są na to szczególnie podatne, i wymyślają sprytne sposoby zmiany kolejności operacji w celu ograniczenia problemu.
Wyjątkiem jest teoria liczb w matematyce, która musi wykonywać operacje arytmetyczne na liczbach z milionami cyfr, ale z absolutną precyzją. Teoretycy liczb często używają bibliotek BigNum, a ich obliczenia zajmują dużo czasu.
źródło
a*b*c
łatwe rzeczy, jednak musisz zmierzyć wymiary, których nie możesz zrobić z absolutną pewnością, dlatego tak naprawdę nie potrzebujesz nieskończonej precyzji obliczeń, wystarczy, aby zostać związanym błędem pomiaru.Jaką alternatywę proponujesz?
Ilości ciągłe są reprezentowane za pomocą liczb rzeczywistych w matematyce. Nie ma żadnego typu danych, który mógłby zakodować każdą możliwą liczbę rzeczywistą (ponieważ liczby rzeczywiste są niepoliczalne), więc oznacza to, że możemy wybrać tylko podzbiór liczb rzeczywistych, którymi jesteśmy najbardziej zainteresowani.
Możesz wybrać wszystkie obliczalne liczby rzeczywiste, co jest podobne do działania systemów algebry komputerowej (CAS). Problem polega na tym, że staje się on szybko niewykonalny, gdy drzewo ekspresji rośnie i rośnie. Jest również bardzo powolny: spróbuj rozwiązać symbolicznie ogromny układ równań różniczkowych w Mathematica i porównaj z innymi implementacjami opartymi na zmiennoprzecinkowych, a zobaczysz dramatyczną różnicę prędkości. Ponadto, jak zauważyli Jörg W Mittag i kasperd: nawet nie masz decydujących operacji równości / porównań.
Możesz użyć dokładnych liczb wymiernych, ale tak naprawdę nie działa to w wielu aplikacjach, ponieważ musisz obliczyć pierwiastki kwadratowe, cosinus lub logarytmy itp. Ponadto istnieje również tendencja do zwiększania złożoności wymiernych, a zatem wymaga więcej miejsca do przechowywania i czas na przetwarzanie, gdy wykonujesz na nich coraz więcej obliczeń.
Możesz także użyć liczb dziesiętnych o dowolnej precyzji, ale nawet coś tak prostego jak podział nie zadziała, ponieważ otrzymujesz nieskończenie powtarzające się cyfry. Możesz również natknąć się na problem rosnącej złożoności, ponieważ wykonujesz bardziej podobne do liczb wymiernych, choć w mniejszym stopniu.
W pewnym momencie będziesz zmuszony użyć aproksymacji, w którym to przypadku najlepiej sprawdzają się liczby zmiennoprzecinkowe. Liczby zmiennoprzecinkowe mają również stałą szerokość (w przeciwieństwie do wszystkich pozostałych 3 typów danych wspomnianych wcześniej), co zapobiega wzrostowi złożoności, gdy wykonujesz na nich coraz więcej obliczeń.
źródło
Twoje twierdzenie o nauce jest błędne, inżynieria i nauka inne niż matematyka nie działają z dokładnymi dokładnymi wynikami. Działają one ze współczynnikiem precyzji wbudowanym w liczbę wyświetlanych cyfr.
Kluczowym terminem, który musisz tu zrozumieć jest: znaczące liczby . Znaczącymi liczbami liczby są te cyfry, które niosą znaczenie przyczyniające się do jej precyzji.
Co w gruncie rzeczy oznacza, że jeśli stwierdzę, że coś ma długość 12 centymetrów, może faktycznie mieć długość między 11,5 a 12,5 centymetra. Jeśli jednak stwierdzę, że coś ma długość 12,00 centymetrów, może to być gdzieś pomiędzy 11995 a 12,005 centymetrów.
Jako przykład, jeśli weźmiesz taśmę pomiarową i zmierzysz swój salon. Chociaż może się okazać, że ma 6 metrów szerokości 25 centymetrów, wiesz, że twój pomiar taśmy nie był wystarczająco dokładny, aby powiedzieć cokolwiek o dokładności milimetrowej lub nanometrowej.
źródło
Zauważ, że liczby zmiennoprzecinkowe są w zasadzie takie same jak notacja naukowa i inżynierska , czyli standardowy sposób pisania liczb w matematyce i nauce. Na tych polach nie ma wielkiej potrzeby ekstremalnej precyzji, ale często istnieje ogromny zasięg.
Aby wybrać przypadkowy przykład z mojej pracy domowej z fizyki, niedawno musiałem pracować z masą elektronu, która wynosi około 9,11 * 10 ^ -31 kg. Nie dbam o precyzję; dla mnie to wszystko może z łatwością wynosić 9,12. Ale zależy mi na wykładniku i nie chcę zapisywać 0,0000 ... 911 kg, więc używam notacji naukowej.
Podobne rozumowanie stosuje się w obliczeniach naukowych i inżynieryjnych: istnieje szeroki zakres, ale nie chcemy przechowywać i pracować z bardzo dużymi liczbami, więc przechowujemy znormalizowaną wartość i wykładnik, który jest mniejszy i szybszy w pracy.
źródło
Liczby zmiennoprzecinkowe mają również kilka właściwości, które dobrze nadają się do obliczania niektórych rodzajów wyników naukowych. Przede wszystkim precyzja jest odwrotnie proporcjonalna do wielkości, tak jak w notacji naukowej, dzięki czemu można przedstawić zarówno małe różnice zbliżone do zera, jak i większe znacznie dalej.
Artykuł Goldberga jest prawdopodobnie najbardziej znaną analizą właściwości liczb zmiennoprzecinkowych (i należy go czytać, jeśli zależy ci na tego rodzaju rzeczach), ale myślę, że prace Kahana lepiej tłumaczą uzasadnienie wielu subtelnych problemy projektowe.
W szczególności diatryba Kahana na temat implementacji zmiennoprzecinkowej w Javie , choć dość zapalna, czyni kilka dobrych argumentów na temat tego, dlaczego semantyka IEEE-754 jest przydatna, a bit wiele hałasu o znakach nic nie bada uzasadnienia znacznej liczby zerowej.
źródło
real
typ, który przechowywałby trzy wpisy stosu do przechowywania i reprezentowałby naturalną precyzję obliczeniową maszyny; wartość może być przechowywana jako 80-bitowa zmiennoprzecinkowa + 16-bitowa zmiennoprzecinkowa 64-bitowa zmiennoprzecinkowa + 32-bitowa zmiennoprzecinkowa lub 64-bitowa mantysa, 16-bitowy wykładnik potęgi i 16 bitów dla znaku i flag [dla implementacji innych niż FPU].float
idouble
są formatami pamięci, ireal
jest formatem obliczeniowym. W wielu systemach bez FPU praca z mantysą, wykładnikiem i flagami na granicy słów i pół słów byłaby szybsza niż konieczność rozpakowywania i przepakowywania kopii podwójnych przy każdej operacji.TL; DR Nie wiemy jak obliczyć większość funkcji z idealną precyzją, dlatego nie ma sensu przedstawiać liczb z idealną precyzją.
Wszystkie dotychczasowe odpowiedzi pomijają najważniejszy punkt: nie możemy obliczyć dokładnych wartości większości liczb. Jako ważny szczególny przypadek nie możemy obliczyć dokładnych wartości funkcji wykładniczej - przytaczając tylko najważniejszą funkcję nieracjonalną.
Naiwna odpowiedź na naiwne pytanie
Wygląda na to, że twoje pytanie brzmi „istnieją dokładne biblioteki arytmetyczne, dlaczego nie używamy ich zamiast arytmetyki zmiennoprzecinkowej?” Odpowiedź brzmi: dokładna arytmetyka działa na liczbach wymiernych i że:
Racjonalna liczba to szczęśliwy wypadek. Większość liczb nie jest racjonalna (patrz twierdzenie Baire'a), więc obliczanie liczb zawsze wyprowadzi nas z racjonalnego świata.
Co to jest obliczanie i reprezentowanie liczby?
Możemy zareagować mówiąc: „OK, problem polega na tym, że liczby wymierne nie były tak doskonałym wyborem do przedstawiania liczb rzeczywistych.” Następnie rozwijamy nasz widelec do debugowania i opracowujemy nowy system reprezentacji liczb rzeczywistych.
Jeśli chcemy obliczyć liczby, musimy wybrać system reprezentacji liczb rzeczywistych i opisać ważne operacje na nich - tj. Zdefiniować, co oznacza obliczanie . Ponieważ interesujemy się obliczeniami naukowymi, chcemy dokładnie przedstawić wszystkie liczby dziesiętne (nasze miary), ich iloraz (liczby wymierne), wartości funkcji wykładniczych i niektóre śmieszne stałe, takie jak liczba Archimede'a.
Problem polega na tym, że jedynym sposobem idealnego przedstawienia liczb w takim systemie jest użycie formy symbolicznej, to znaczy, aby w ogóle nic nie obliczać i pracować z wyrażeniami algebraicznymi. To raczej kaleka reprezentacja liczb rzeczywistych, ponieważ nie możemy wiarygodnie porównać dwóch liczb (która jest większa)? Nie możemy nawet łatwo odpowiedzieć na pytanie „Czy podana liczba jest równa 0?”.
Jeśli szukasz bardziej precyzyjnych matematycznych definicji i problemów, poszukaj liczb wymiernych, liczb transcendentalnych, najlepszych przybliżeń i twierdzenia Baire'a.
źródło
Dlatego
1) Autorzy przyjmują założenia, że „obliczenia inżynierskie i naukowe” mierzą wielkości fizyczne w świecie rzeczywistym
2) Ilości fizyczne są ciągłe i dokładnie tak, jak podajesz „liczby zmiennoprzecinkowe pozwalają modelować wielkości ciągłe”
.. a resztę mojej odpowiedzi ładnie podsumował Rufflewind , więc nie zamierzam tego tutaj powtarzać.
źródło
Liczby zmiennoprzecinkowe zapewniają względną dokładność: mogą reprezentować liczby, które są co najwyżej małym procentem (jeśli chcesz zadzwonić np. O 0,0000000000001% procent) od dowolnej dokładnej liczby w szerokim zakresie liczb. Dzielą tę cechę z regułą suwaka, choć ta ostatnia nie jest lepsza niż 3 cyfry dokładności. Nadal wystarczało to do obliczenia sił statycznych i dynamicznych dużych struktur, zanim komputery cyfrowe stały się do tego powszechne, a to dlatego, że stałe materiałowe również wykazują pewne różnice, a wybieranie konstrukcji, które są względnie łagodne względem różnic materiałowych i konstrukcyjnych, będą miały tendencję aby racjonalnie można było zidentyfikować maksymalne obciążenia i słabe punkty.
Teraz „dokładność” jest przydatną funkcją dla wielu liczb reprezentujących pomiary i / lub wielkości właściwości fizycznych.
Nie wszystko w nauce / inżynierii należy do tej kategorii. Na przykład, jeśli używasz transformacji teoretycznych do mnożenia dużych liczb lub pól Galois do manipulowania wielomianami z korekcją błędów, nie ma czegoś takiego jak mały błąd: jakikolwiek błąd jednego bitu podczas przetwarzania doprowadzi do wyników, które są zupełnie nie do odróżnienia od całkowicie losowych hałas.
Nawet w tych obszarach można pracować z liczbami zmiennoprzecinkowymi (np. Stosując złożone FFT do wykonania splotu), jeśli śledzi się nagromadzenie błędów i upewnia się, że błędy zmiennoprzecinkowe nie kumulują się na tyle, aby możliwe było nawet odwrócenie jednego bitu rzeczywiste byty, których są przybliżeniami. Dla takich aproksymacji przetwarzanie stałoprzecinkowe byłoby prawdopodobnie bardziej odpowiednie, ale jednostki zmiennoprzecinkowe w terenie zwykle zapewniają szybszą pracę i większą liczbę użytecznych bitów.
Również języki programowania, takie jak C lub Fortran, sprawiają, że zaskakująco trudno jest uzyskać dostęp do podstawowych operacji, takich jak mnożenie i dzielenie z precyzją mieszaną lub bit przenoszenia dla dodawania / odejmowania, a są to podstawowe elementy składowe wychodzące poza liczby całkowite o ograniczonej precyzji.
Jeśli więc możesz odwzorować operacje na liczby zmiennoprzecinkowe, masz obecnie do dyspozycji dość potężny sprzęt i możesz dość dobrze określić swoje algorytmy w jednym z dzisiejszych języków programowania ogólnego przeznaczenia.
źródło
Myślę, że można na to odpowiedzieć, zwracając uwagę na typy aplikacji
float
/double
danych, które nie są odpowiednie.Jeśli musisz upewnić się, że możesz dokładnie przedstawić liczbę za pomocą określonej liczby cyfr, liczby zmiennoprzecinkowe są nieodpowiednie, ponieważ reprezentują liczby jako potęgi 2, a nie potęgi 10, tak jak reprezentujemy liczby w realny świat.
Tak więc jedną domeną, w której nie należy stosować typów danych zmiennoprzecinkowych, jest finanse *. W przypadku podstawowego systemu np. Banku byłoby całkowicie niedopuszczalne, gdyby kwota, która powinna wynosić 100 000,01 USD, nagle stała się 100 000,00 USD lub 100 000,02 USD.
Taki problem może łatwo wystąpić przy stosowaniu liczb zmiennoprzecinkowych, zwłaszcza jeśli liczba była wynikiem jednego lub więcej obliczeń, np. Obliczenia sumy wszystkich transakcji na rachunku.
Inżynieria i obliczenia naukowe to dziedziny, w których te stosunkowo małe błędy zaokrąglania są dopuszczalne. Użytkownicy są zwykle świadomi, że wszystkie liczby mają ograniczoną precyzję i często pracują z wieloma cyframi znaczącymi . Ale co najważniejsze, mają one dokładnie określoną względną precyzję, tj. Podają taką samą liczbę cyfr znaczących, zarówno dla bardzo dużych liczb, jak i dla bardzo małych liczb.
* Kiedyś pracowałem nad aplikacją finansową, w której
float
s były używane do reprezentowania wartości, iw konsekwencji wprowadzono błędy zaokrąglania. Na szczęście ten konkretny błąd w ogóle nie był krytyczny, użytkownicy narzekali na błędy obliczeniowe w programie. Doprowadziło to do innego, znacznie gorszego efektu: użytkownicy zaczęli tracić wiarę w system.źródło