Float i Double - Którego powinienem użyć?

Anonim

(Uwaga: w tym artykule założono, że czytelnicy wiedzą o podstawach informatyki)

Wielu początkujących programistów / studentów, którzy są zapisani w informatyce, pyta najczęściej zadawane pytania, które są istotne dla danej dziedziny z informatyki, którą studiują. Większość kursów dla początkujących rozpoczyna się od tematów systemu liczbowego używanego w nowoczesnych komputerach, w tym w dwójkowy , dziesiętny , ósemkowy i szesnastkowy system. Są to formaty numerów komputerów, które są wewnętrznymi reprezentacjami wartości liczbowych w komputerach (lub kalkulatorach i każdym innym rodzaju komputerów cyfrowych). Wartości te są przechowywane jako "grupowanie bitów".

Jak wiemy komputery reprezentują dane w zestawach cyfr binarnych (tj. W kombinacji 1s i 0s, Jak na przykład, 1111 reprezentuje 15 w systemie dziesiętnym), ma sens nauczanie o różnych formatach liczb, które są używane do reprezentowania dynamicznego zakresu wartości, ponieważ stanowią one podstawowe bloki przetwarzania obliczeń / liczb w dowolnym rodzaju operacji. Po zdefiniowaniu systemu numerów w klasie (często słabo), uczniowie mają ochotę przejść do różnych formatów liczb w tym samym typie (tj. Arytmetyka zmiennoprzecinkowa ), które mają pewną precyzję i zakres liczb. W związku z tym są zmuszeni do poznania niuansów między pewnymi typami. Dwa z najczęściej używanych typów danych to Pływak i Podwójnie i chociaż są ukierunkowane na te same potrzeby (tj. Arytmetyka zmiennoprzecinkowa ), istnieje pewna różnica w ich wewnętrznej reprezentacji i ogólnym wpływie na obliczenia w programie. Szkoda, że ​​wielu programistów nie dostrzega niuansów między typami danych typu "płaski" i "podwójny", a ostatecznie używa ich w miejscach, w których nie powinno się ich używać. Ostatecznie powoduje błędne obliczenia w innych częściach programu.

W tym artykule opiszę różnicę pomiędzy zmiennoprzecinkową i podwójną z przykładami kodu w języku programowania C. Zacznijmy!

Float vs Double … O co chodzi?

Float i Double są reprezentacją danych, które są używane do operacji arytmetycznych zmiennoprzecinkowych, myśl o liczbach dziesiętnych, które można obliczyć w klasie matematyki, takich jak 20.123, 16.23, 10.2itd., nie są to liczby całkowite (tj. 2, 5, 15itp.), a więc wymagają uwzględnienia ułamków w pliku binarnym. Jako wynikowe liczby dziesiętne (tj. 20.123, 16.23itp.) nie mogą być łatwo przedstawione za pomocą normalnego formatu binarnego (tj. Integer). Główną różnicą między Float i Double jest to, że pierwsza jest pojedynczą precyzją (32-bitowymi) danymi zmiennoprzecinkowymi, podczas gdy druga jest typu danych zmiennoprzecinkowych z podwójną precyzją (64-bitową). Double nazywa się "double", ponieważ jest to w zasadzie podwójna, precyzyjna wersja Float. Jeśli obliczasz ogromną ilość (pomyśl o tysiącach zera w liczbie), to niedokładności będą mniejsze w Double i nie stracisz dużej precyzji.

Lepiej jest opracować za pomocą przykładów kodu. Poniżej przedstawiono operację na Float i Double poprzez funkcje matematyczne dostępne w języku C:

#zawierać

int main () {

float num1 = 1.f / 82;

float num2 = 0;

dla (int i = 0; i <738; ++ i)

num2 + = num1;

printf ("%. 7g n", nr2);

podwójne num3 = 1,0 / 82;

podwójne num4 = 0;

dla (int i = 0; i <738; ++ i)

num4 + = num3;

printf ("%.15g n", nr4);

getchar ();

}

Drukuje następujące elementy:

9.000031

8.99999999999983

Tutaj widać, że niewielka różnica w precyzji Float i Double daje zupełnie inną odpowiedź, aczkolwiek Double wydaje się być bardziej dokładna niż Float.

Poniżej znajduje się przykład funkcji sqrt () w C:

#zawierać

#zawierać

int main () {

float num1 = sqrt (2382719676512365.1230112312312312);

double num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f n", num1);

printf ("% f n", nr2);

getchar ();

}

Daje następujące wyniki:

48813108.000000

48813109.678778

Tutaj widać, że odpowiedź w Double ma większą precyzję.

Ogólnie rzecz biorąc, lepiej jest używać Double'a do arytmetyki zmiennoprzecinkowej, ponieważ kilka standardowych funkcji matematycznych w C operuje na Double, a nowoczesne komputery są niezwykle szybkie i wydajne w przypadku podwójnych obliczeń zmiennoprzecinkowych. Prowadzi to do zmniejszenia konieczności użycia Float, chyba że musisz operować na wielu liczbach zmiennoprzecinkowych (myśl o dużych tablicach z tysiącami zera w liczbach) lub pracujesz w systemie, który nie obsługuje podwójnego precyzja zmiennoprzecinkowa, tyle układów GPU, urządzeń o niskim poborze mocy i niektórych platform (ARM Cortex-M2, Cortex-M4 itp.) nie obsługuje jeszcze Double, wtedy powinieneś użyć Float. Ponadto należy pamiętać, że niektóre procesory graficzne / procesory działają lepiej / wydajniej w przetwarzaniu Float, jak w przypadku obliczeń wektorów / macierzy, więc może zajść potrzeba przejrzenia podręcznika / dokumentacji specyfikacji sprzętu, aby lepiej zdecydować, który z nich należy zastosować. dla konkretnej maszyny.

Rzadko istnieje powód, aby używać Float zamiast Double w kodzie kierowanym na nowoczesne komputery.Dodatkowa precyzja w Double zmniejsza, ale nie eliminuje, szansę na zaokrąglenia błędów lub innych niedokładności, które mogą powodować problemy w innych częściach programu. Wiele funkcji matematycznych lub operatorów konwertuje i zwraca Double, więc nie musisz odsyłać liczb do Float, ponieważ może to stracić precyzję. Aby uzyskać szczegółową analizę arytmetyki zmiennoprzecinkowej, bardzo polecam przeczytanie tego niesamowitego artykułu (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

streszczenie

Więc … w pigułce:

Miejsca, w których powinieneś używać Float:

  • Jeśli celujesz w sprzęt, w którym pojedyncza precyzja jest szybsza od podwójnej precyzji.
  • Twoja aplikacja intensywnie wykorzystuje arytmetykę zmiennoprzecinkową, np. Tysiące liczb z tysiącami zer.
  • Robisz bardzo niskopoziomową optymalizację. Na przykład używasz specjalnych instrukcji CPU (tj. SSE, SSE2, AVX itp.), Które działają na wielu numerach / tablicach / wektorach naraz.

Wniosek

W tym artykule podkreślam różnicę między Float i Double, a która z nich powinna być używana w określonych miejscach. Prawdopodobnie lepiej jest używać Double w większości miejsc na ślepo, szczególnie jeśli celujesz w nowoczesne komputery, ponieważ szanse na niską efektywność ze względu na użycie arytmetyki zmiennoprzecinkowej Double są mało prawdopodobne. Jeśli masz jakieś pytania, możesz zapytać w sekcji komentarzy poniżej!