Razlika između lebdeće i dvostruke - koju trebam koristiti?

(Napomena: Ovaj članak pretpostavlja da čitatelji znaju o osnovama informatike)

Mnogi novopečeni programeri / studenti koji su upisani u računalne znanosti postavljaju često postavljana pitanja koja su relevantna za određeno područje unutar računarskih znanosti koje studiraju. Većina početničkih tečaja započinje temama brojevnog sustava koji se koristi u suvremenim računalima, uključujući i binarni, decimal, oktalni i heksadecimalni sustav. Ovo su formati brojeva računala koji su unutarnji prikazi numeričkih vrijednosti u računalima (ili kalkulatorima i bilo kojoj drugoj vrsti digitalnih računala). Te se vrijednosti pohranjuju kao "grupiranje bitova".

Kao što znamo računala predstavljaju podatke u skupovima binarnih znamenki (tj. U kombinaciji od 1s i 0s, kao što su, 1111 predstavlja 15 u decimalnom sustavu) ima smisla podučavati o različitim formatima brojeva koji se koriste za predstavljanje dinamičkog raspona vrijednosti, jer oni čine osnovne blokove izračuna / obrade broja u bilo kojoj operaciji. Nakon što je definiran sustav brojeva u učionici (često loše), učenici će doći u iskušenje da prijeđu na različite brojeve oblika unutar iste vrste (tj.., aritmetika s pomičnim zarezom) koji imaju određenu preciznost i raspon broja. Stoga su prisiljeni naučiti nijanse između pojedinih vrsta. Dvije su najčešće korištene vrste podataka Plutati i Dvostruko, i dok ciljaju iste potrebe (tj., aritmetika s pomičnim zarezom), postoje neke razlike u njihovom unutarnjem predstavljanju i ukupnom učinku na izračun u programu. Nažalost, mnogi programeri propuštaju nijanse između podataka tipa Flat i Double i na kraju ih zloupotrebljavaju na mjestima gdje ih uopće ne bi trebali koristiti. Konačno rezultira pogrešnim izračunima u ostalim dijelovima programa.

U ovom ću vam članku reći razliku između float i double kod primjera koda u programskom jeziku C. Započnimo!

Float vs Double ... Koji je dogovor?

Float i Double su prikazani podaci koji se koriste za aritmetičke operacije s pomičnim zarezom, a mislite na decimalne brojeve koje računate u matematičkoj klasi, kao što su, 20,123, 16.23, 10.2, itd., to nisu cijeli brojevi (tj., 2, 5, 15, itd.), stoga zahtijevaju razmatranje ulomaka u binarnom obliku. Kao rezultirajući decimalni brojevi (tj., 20,123, 16.23, itd.) ne može se lako predstaviti normalnim binarnim formatom (tj., cijeli broj). Glavna razlika između Float i Double je u tome što su prvi precizni (32-bitni) podaci s pomičnim zarezom, dok je potonji tip podataka s pomičnom točkom s dvostrukom preciznošću (64-bitni). Double se naziva "double" jer je u osnovi verzija dvostruke preciznosti Floata. Ako izračunavate ogroman iznos (pomislite na tisuće broja 0 u broju), netočnosti će biti manje u Double-u i nećete izgubiti puno preciznosti.

Bolje je razraditi primjere kodova. Slijedi operacija na Float i Double preko matematičkih funkcija pruženih na jeziku C:

#include

int main ()

float num1 = 1.f / 82;

float num2 = 0;

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

num2 + = num1;

printf ("%. 7g \ n", num2);

dvostruki broj3 = 1,0 / 82;

dvostruki broj4 = 0;

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

num4 + = num3;

printf ("%. 15g \ n", broj4);

getchar ();

Ispisuje sljedeće:

9.000031

8,99999999999983

Ovdje možete vidjeti da mala razlika u preciznosti Floata i Doublea daje potpuno drugačiji odgovor, premda se čini da je Double precizniji od Floata.

Slijedi primjer funkcije sqrt () u C:

#include

#include

int main ()

float num1 = sqrt (2382719676512365.1230112312312312);

dvostruki broj2 = sqrt (2382719676512365.1230112312312312);

printf ("% f \ n", broj1);

printf ("% f \ n", num2);

getchar ();

Daje sljedeće rezultate:

48813108.000000

48813109.678778

Ovdje možete vidjeti da odgovor u Double-u ima bolju preciznost.

Sve u svemu, za aritmetiku s pomičnom zarezom bolje je koristiti Double, jer nekoliko standardnih matematičkih funkcija u C djeluje na Double i moderna računala su izuzetno brza i učinkovita za dvostruko izračunavanje s pomičnim zarezom. To dovodi do smanjenja potrebe za korištenjem Float-a, osim ako ne trebate raditi na puno brojeva s pomičnom zarezom (mislite na velike nizove s tisućama broja 0-a u brojevima) ili ako radite na sustavu koji ne podržava dvostruki broj, preciznost plutajuće točke, jer mnogi GPU-ovi, uređaji s malim napajanjem i određene platforme (ARM Cortex-M2, Cortex-M4, itd.) još ne podržavaju Double, tada biste trebali koristiti Float. Uz to, treba zapamtiti da određeni GPU-ovi / CPU-ovi djeluju bolje / učinkovitije u Float obradi, poput izračuna vektora / matrice, tako da ćete možda trebati potražiti priručnik / dokumentaciju za hardver kako biste bolje odlučili koji ćete koristiti za određeni stroj.

Rijetko postoji razlog da se u kodu koji cilja moderna računala koristi Float umjesto Double. Dodatna preciznost Double-a smanjuje, ali ne uklanja, mogućnost zaokruživanja ili druge nepreciznosti koje mogu uzrokovati probleme u ostalim dijelovima programa. Mnoge matematičke funkcije ili operatori pretvaraju i vraćaju Double, tako da vam ne treba bacati brojeve na Float, jer bi to moglo izgubiti preciznost. Za detaljnu analizu aritmetike s pomičnim zarezom toplo vam preporučujem da pročitate ovaj sjajan članak (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Sažetak

Dakle ... na kratko:

Mjesta na kojima biste trebali koristiti Float:

  • Ako ciljate hardver gdje je jednostruka preciznost brža od dvostruke preciznosti.
  • Vaša aplikacija koristi aritmetiku s pomičnim zarezom, poput tisuća brojeva s tisućama 0.
  • Radite na vrlo niskoj optimizaciji. Na primjer, koristite posebne CPU upute (tj. SSE, SSE2, AVX itd.) Koje rade na više brojeva / nizova / vektora odjednom..

Zaključak

U ovom sam članku istaknuo razliku između Float-a i Double-a i koji se treba koristiti na određenim mjestima. Svakako, bolje je Double koristiti na većini mjesta slijepo, posebno ako ciljate moderna računala, jer su šanse za nisku učinkovitost zbog upotrebe dvostruke aritmetike s pomičnim zarezom vrlo malo vjerojatne. Ako imate bilo kakvih pitanja, možete ih pitati u odjeljku za komentare u nastavku!