Często w moim doświadczeniu programistycznym muszę decydować, czy powinienem używać liczb zmiennoprzecinkowych, czy podwójnych dla moich liczb rzeczywistych. Czasami wybieram float, czasem podwójny, ale tak naprawdę wydaje się to bardziej subiektywne. Gdybym miał stanąć w obronie mojej decyzji, prawdopodobnie nie podałbym rozsądnych powodów.
Kiedy używasz pływaka, a kiedy używasz podwójnego? Czy zawsze używasz podwójnie, tylko gdy występują ograniczenia pamięci, wybierasz float? A może używasz zawsze zmiennoprzecinkowego, chyba że wymaganie precyzji wymaga użycia podwójnego? Czy istnieją jakieś istotne różnice dotyczące złożoności obliczeniowej podstawowej arytmetyki między zmiennoprzecinkową i podwójną? Jakie są zalety i wady używania float lub double? A czy używałeś długiego podwójnego?
źródło
Odpowiedzi:
Domyślnym wyborem dla typu zmiennoprzecinkowego powinna być
double
. Jest to również typ, który można uzyskać z literałów zmiennoprzecinkowych bez przyrostka lub (w C) standardowych funkcji, które działają na liczb zmiennoprzecinkowych (npexp
,sin
itp).float
powinien być stosowany tylko wtedy, gdy musisz operować na wielu liczbach zmiennoprzecinkowych (pomyśl w kolejności tysięcy lub więcej), a analiza algorytmu wykazała, że zmniejszony zakres i dokładność nie stanowią problemu.long double
można użyć, jeśli potrzebujesz większego zasięgu lub dokładności niżdouble
i jeśli zapewnia to na platformie docelowej.Podsumowując,
float
ilong double
powinno być zarezerwowane do użytku przez specjalistów, adouble
dla „codziennego użytku”.źródło
float
(i czasami półprecyzyjności), ponieważ ani ludzkie oko, wyświetlacz, ani system kolorów nie ma tak wielu bitów precyzji . Ta rada dotyczy np. OpenGL itp. Ta dodatkowa rada nie dotyczy obrazów medycznych, które mają bardziej rygorystyczne wymagania dotyczące precyzji.Rzadko zdarza się, aby używać kodu zmiennoprzecinkowego zamiast podwójnego kodu w nowoczesnych komputerach. Dodatkowa precyzja zmniejsza (ale nie eliminuje) szansę na błędy zaokrąglania lub inne niedokładności powodujące problemy.
Głównymi powodami, dla których mogę wymyślić float, są:
Zasadniczo więc, podwójna jest droga, chyba że masz ograniczenia sprzętowe lub jeśli analiza nie wykazała, że przechowywanie liczb podwójnej precyzji znacząco przyczynia się do zużycia pamięci.
źródło
Użyj
double
do wszystkich obliczeń i zmiennych temp. Używaj,float
gdy chcesz zachować tablicę liczb -float[]
(jeśli dokładność jest wystarczająca), a masz do czynienia z dziesiątkami tysięcyfloat
liczb.Wiele / większość funkcji matematycznych lub operatory konwertują / zwracają
double
i nie chcesz rzutować liczb z powrotemfloat
na żadne pośrednie kroki.Np. Jeśli masz dane wejściowe 100 000 liczb z pliku lub strumienia i musisz je posortować, wpisz liczby w
float[]
.źródło
Niektóre platformy (ARM Cortex-M2, Cortex-M4 itp.) Nie obsługują podwójnie (zawsze można to sprawdzić w instrukcji obsługi procesora. Jeśli nie ma ostrzeżeń lub błędów kompilacji, nie oznacza to, że kod jest optymalny. podwójne mogą być emulowane.). Dlatego może być konieczne trzymanie się int lub float .
Jeśli tak nie jest, użyłbym podwójnie .
Możesz sprawdzić słynny artykuł D. Goldberga („Co każdy informatyk powinien wiedzieć o arytmetyki zmiennoprzecinkowej”). Powinieneś pomyśleć dwa razy, zanim użyjesz arytmetyki zmiennoprzecinkowej. Istnieje spora szansa, że w ogóle nie są potrzebne w Twojej konkretnej sytuacji.
http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf
źródło
W przypadku rzeczywistych problemów próg próbkowania danych jest ważny podczas odpowiedzi na to pytanie. Podobnie ważna jest również podłoga szumowa. Jeśli jedno z typów danych zostanie przekroczone, zwiększenie precyzji nie przyniesie korzyści.
Większość samplerów w świecie rzeczywistym jest ograniczona do 24-bitowych przetworników cyfrowo-analogowych. Sugerowanie, że 32 bity precyzji w obliczeniach w świecie rzeczywistym powinny być odpowiednie, gdy znaczenie i 24 bity precyzji.
Podwójna precyzja kosztuje 2x pamięć. W związku z tym ograniczenie użycia liczby podwójnej w stosunku do liczb zmiennoprzecinkowych może drastycznie zmniejszyć zużycie pamięci / przepustowość działających aplikacji.
źródło
Wybór zmiennej, która ma być używana między zmiennoprzecinkową i podwójną, zależy od dokładności wymaganych danych. Jeśli wymagana jest niewielka różnica w stosunku do rzeczywistej odpowiedzi, liczba wymaganych miejsc dziesiętnych będzie duża, a zatem dyktuje to użycie podwójnej liczby. Przecięcie części miejsc dziesiętnych zmniejszy dokładność.
źródło
Zwykle używam tego
float
typu, gdy nie potrzebuję dużej precyzji - na przykład w przypadku pieniędzy - co jest złe, ale do tego jestem przyzwyczajony.Z drugiej strony używam,
double
gdy potrzebuję większej precyzji, na przykład w przypadku złożonych algorytmów matematycznych.Standard C99 mówi:
Nigdy tak naprawdę nie korzystałem
long double
, ale nie używam C / C ++ zbyt często. Zwykle używam dynamicznie pisanych języków, takich jak Python, gdzie nie musisz się przejmować typami.Aby uzyskać więcej informacji o Double vs Float , zobacz to pytanie w SO .
źródło
Decimal
jest typem zmiennoprzecinkowym i zazwyczaj jest dobrym wyborem do obliczania pieniędzy.