Różnica między pływakiem a podwójnym - którego należy użyć?

Różnica między pływakiem a podwójnym - którego należy użyć?

(Uwaga: ten artykuł zakłada, że ​​czytelnicy wiedzą o podstawach informatyki)

Wielu nowicjuszów / studentów, którzy są zapisani na informatykę, zadaje często zadawane pytania dotyczące konkretnej dziedziny w informatyce, którą studiują. Większość kursów początkujących zaczyna się od tematów systemu liczbowego używanego we współczesnych komputerach, w tym dwójkowy, dziesiętny, Octal I szesnastkowy system. Są to formaty liczb komputerowych, które są wewnętrznymi reprezentacjami wartości liczbowych w komputerach (lub kalkurachach i dowolnym innym rodzaju komputerach cyfrowych). Wartości te są przechowywane jako „grupowanie bitów”.

Jak wiemy, komputery przedstawiają dane w zestawach cyfr binarnych (i.mi., w połączeniu 1s I 0s, Jak na przykład, 1111 reprezentuje 15 w systemie dziesiętnym) warto nauczyć o różnych formatach liczb używanych do reprezentowania dynamicznego zakresu wartości, ponieważ stanowią one podstawowe bloki obliczeń/przetwarzania liczb w dowolnym rodzaju operacji. Po zdefiniowaniu systemu liczb w klasie (często słabo), uczniowie mają pokusę, aby przejść do różnych formatów liczb w tym samym rodzaju (i.mi., Arytmetyka zmiennoprzecinkowa), które mają pewną precyzję i zakres liczb. W ten sposób są zmuszeni nauczyć się niuansów między niektórymi typami. Dwa z najczęściej używanych typów danych to Platforma I Podwójnie, i chociaż są skierowane do tych samych potrzeb (ja.mi., Arytmetyka zmiennoprzecinkowa), istnieje dość różnica w ich wewnętrznej reprezentacji i ogólny wpływ na obliczenia w programie. To niefortunne, że wielu programistów tęskni za niuansami między płaskimi i podwójnymi typami danych, a ostatecznie nadużywa ich w miejscach, w których nie należy ich używać przede wszystkim. Ostatecznie powoduje błędne obliczenia w innych częściach programu.

W tym artykule powiem ci różnicę między pływakiem a podwójnym z przykładami kodu w języku programowania C. Zacznijmy!

Float vs podwójny… jaka jest oferta?

Float i podwójne to reprezentacja danych, które są używane do operacji arytmetycznych o zmiennym punkcie, pomyśl o liczbach dziesiętnych, które obliczasz w klasie matematyki, takich jak, 20.123, 16.23, 10.2, itp., nie są liczbami całkowitymi (i.mi., 2, 5, 15, itp.), w ten sposób wymagają uwzględnienia ułamków w binarie. Jako wynikowe liczby dziesiętne (i.mi., 20.123, 16.23, itp.) nie można łatwo reprezentować normalnym formatem binarnym (i.mi., Liczba całkowita). Główna różnica między pływakiem a podwójnym polega na tym, że ta pierwsza jest dane o pojedynczej precyzji (32-bitowej), podczas gdy drugi jest podwójną precyzją (64-bitową) typu danych o punkcie zmiennoprzecinkowym. Podwójne nazywa się „podwójnie”, ponieważ jest to w zasadzie podwójna precyzyjna wersja float. Jeśli obliczasz ogromną kwotę (pomyśl o tysiącach 0 w liczbie), wówczas niedokładności będzie mniejsze w podwójnym i nie stracisz dużej precyzji.

Lepiej jest opracować przy użyciu przykładów kodu. Poniżej znajduje się operacja na float i podwójnie poprzez funkcje matematyczne podane w języku C:

#włączać

int main ()

float NUM1 = 1.f / 82;

float num2 = 0;

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

num2 += num1;

printf („%.7G \ n ”, num2);

Double Num3 = 1.0/82;

Double Num4 = 0;

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

num4 += num3;

printf („%.15g \ n ”, Num4);

getchar ();

Drukuje następujące:

9.000031

8.99999999999983

Tutaj widać, że niewielka różnica w precyzji pływaka i podwójnej daje zupełnie inną odpowiedź, choć podwójne wydaje się być dokładniejsze niż pływak.

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

#włączać

#włączać

int main ()

float num1 = sqrt (2382719676512365.1230112312312312);

podwójny NUM2 = SQRT (2382719676512365.1230112312312312);

printf („%f \ n”, num1);

printf („%f \ n”, num2);

getchar ();

Daje następujące dane wyjściowe:

48813108.000000

48813109.678778

Tutaj widać, że odpowiedź w podwójnej ma lepszą precyzję.

Podsumowując, lepiej jest użyć podwójnej arytmetyki o zmiennym punkcie, ponieważ kilka standardowych funkcji matematycznych w C działa na podwójnych i nowoczesnych komputerach. Prowadzi to do zmniejszenia potrzeby używania pływaków, chyba że musisz działać na wielu liczbach zmiennoprzecinkowych (pomyśl o dużych tablicach z tysiącami 0 w liczbach) lub obsługujesz w systemie, który nie obsługuje podwójnie- Precyzyjne zmiennoprzecinkowe, podobnie jak wiele GPU, urządzenia o niskiej mocy i niektóre platformy (Cortex-M2, Cortex-M4 itp.) Nie wspieraj jeszcze podwójnie, a następnie powinieneś używać float. Ponadto jedną rzeczą do zapamiętania jest to, że niektóre GPU / CPU działają lepiej / wydajne w przetwarzaniu zmiennoprzecinkowym, jak w obliczeniach wektorów / macierzy, więc może być konieczne poszukiwanie instrukcji / dokumentacji specyfikacji sprzętowej, aby lepiej zdecydować, z którego użycia należy użyć dla konkretnej maszyny.

Istnieje rzadko powód użycia pływaka zamiast podwójnego w kodzie skierowanym do nowoczesnych komputerów. Dodatkowa precyzja w podwójnej zmniejsza, ale nie eliminuje, szansa na zaokrąglanie błędów lub inną niedokładność, która może powodować problemy w innych częściach programu. Wiele funkcji matematycznych lub operatorów konwertuje i zwraca podwójnie, więc nie musisz rzucić liczb z powrotem, aby unosić się, ponieważ może to stracić precyzję. Aby uzyskać szczegółową analizę arytmetyki o zmiennym punkcie, gorąco polecam przeczytanie tego niesamowitego artykułu (http: // dokumentów.wyrocznia.com/cd/e19957-01/806-3568/ncg_goldberg.html).

Streszczenie

Więc… w skrócie:

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

  • Jeśli atakujesz sprzęt, w którym pojedyncza precyzja jest szybsza niż podwójna precyzja.
  • Twoja aplikacja ciężko wykorzystuje arytmetykę zmiennoprzecinkową, jak tysiące liczb o tysiącach 0.
  • Wykonujesz optymalizację o bardzo niskim poziomie. Na przykład używasz specjalnych instrukcji procesora (i.mi., SSE, SSE2, AVX itp.) które działają na wielu liczbach / tablicach / wektorach jednocześnie.

Wniosek

W tym artykule podkreśliłem różnicę między pływakiem a podwójnym, a którą należy użyć w określonych miejscach. Prawdopodobnie lepiej jest używać podwójnego w większości miejsc ślepo, zwłaszcza jeśli atakujesz nowoczesne komputery, ponieważ szanse na niską wydajność ze względu na zastosowanie arytmetyki o podwójnym punkcie pływającym są bardzo mało prawdopodobne. Jeśli masz jakieś pytania, możesz zapytać w sekcji komentarzy poniżej!