Float i Double - Koji bi trebao koristiti?

Anonim

(Napomena: Ovaj članak pretpostavlja da čitatelji znaju o osnovama informatičke znanosti)

Mnogi programeri / studenti koji su upisani u računalnu znanost pitaju često postavljana pitanja koja su relevantna za određeno polje unutar računalne znanosti koju studiraju. Većina početničkih tečajeva započinje temama numeričkog sustava koji se koristi u modernim računalima, uključujući i binarni , decimal , oktalni i heksadecimalni sustav. To su formati računalnih brojeva koji su interni prikazi numeričkih vrijednosti u računalima (ili računalima i bilo kojom drugom vrstom digitalnih računala). Te se vrijednosti pohranjuju kao "grupiranje bitova".

Kao što znamo, računala predstavljaju podatke u skupovima binarnih znamenki (tj. U kombinaciji 1s i 0s, kao što su, 1111 predstavlja 15 u decimalnom sustavu), ima smisla podučavati o različitim formatima broja koji se koriste za predstavljanje dinamičkog raspona vrijednosti, jer čine osnovne blokove obračuna / obradu broja u bilo kojoj vrsti operacija. Kada se brojčani sustav definira u učionici (često slabo), učenici su u iskušenju da se presele u različite oblike brojeva unutar istog tipa (tj. aritmetika s pomičnim zarezom ) koji imaju određenu preciznost i brojčani raspon. Dakle, prisiljeni su naučiti nijanse između pojedinih vrsta. Dvije od najčešće korištenih vrsta podataka su Plutati i Dvostruko , i dok ciljaju iste potrebe (tj. aritmetika s pomičnim zarezom ), postoji dosta razlika u njihovoj unutarnjoj zastupljenosti i ukupnom učinku na izračun u programu. Nesreća je da mnogi programeri propuštaju nijanse između vrsta ravnih i dvostrukih podataka, a na kraju ih zloupotrebljavaju na mjestima na kojima se ne smiju upotrebljavati na prvom mjestu. Naposljetku je rezultiralo pogrešnim izračunima u drugim dijelovima programa.

U ovom članku, kažem vam razliku između floata i dvostrukog kod primjera koda u C programskom jeziku. Započnimo!

Float vs Double … Što je posao?

Float i Double predstavljaju prikaz podataka koji se koriste za aritmetičke operacije s pomičnim zarezom, mislim na decimalne brojeve koje izračunate u matematičkoj klasi, kao što su, 20.123, 16.23, 10.2, itd., oni nisu cijeli brojevi (tj. 2, 5, 15, itd.), stoga zahtijevaju razmatranje frakcija u binarnom. Kao rezultat decimalnih brojeva (tj. 20.123, 16.23, itd.) ne može se lako predstaviti normalnim binarnim formatom (tj. Integer). Glavna razlika između Floata i Doublea je ta da je prva jednadžba (32-bitna) točka s pomičnim zarezom, dok je posljednja dvostruka preciznost (64-bitna) vrsta podataka s pomičnim zarezom. Dvostruko se naziva "dvostruko" jer je u osnovi dvostruka preciznost inačice Floata. Ako izračunavate veliku količinu (misli na tisuće 0-ih u broju), tada će netočnosti biti manja u Doubleu i nećete izgubiti preciznost.

Bolje je razraditi pomoću primjera koda. Sljedeće je operacija na Float i Double pomoću math funkcija koje se nalaze na C jeziku:

#include

int glavni () {

float num1 = 1.f / 82;

float num2 = 0;

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

num2 + = num1;

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

dvostruko num3 = 1.0 / 82;

dvostruko num4 = 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 lagana razlika u preciznosti Floata i Doublea daje drugačiji odgovor, iako Double izgleda točniji od Floata.

Slijedi primjer sqrt () funkcije u C:

#include

#include

int glavni () {

plutajte num1 = sqrt (2382719676512365.1230112312312312);

dvostruko num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

getchar ();

}

Ona daje sljedeći izlaz:

48813108.000000

48813109.678778

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

Sve u svemu, bolje je koristiti Double za aritmetiku s pomičnim zarezom, jer nekoliko funkcija standardne matematike u C radi na Double i modernim računalima su izuzetno brze i učinkovite za izračun dvostrukih pomičnih točaka. To dovodi do smanjenja potrebe za korištenjem Floata, osim ako ne morate raditi na brojnim brojevima s pomičnim zarezom (mislim na velike polja s brojem tisuća 0-ih) ili radite na sustavu koji ne podržava dvostruko precizna pomična točka, kao i mnogi GPU-i, uređaji s niskim napajanjem i određene platforme (ARM Cortex-M2, Cortex-M4 itd.) ne podržavaju još Double, a zatim upotrijebite Float. Osim toga, jedna stvar koju treba zapamtiti je da određeni GPU-ovi / CPU-ovi rade bolje / učinkovitije u procesiranju Floata, kao u izračunu vektora / matrice, tako da ćete možda morati potražiti priručnik / dokumentaciju specifikacije hardvera kako biste bolje odlučili koji biste trebali koristiti za određeni stroj.

Rijetko je razlog upotrebljavati Float umjesto Double u kodu koji cilja suvremena računala.Dodatna preciznost u Doubleu smanjuje, ali ne eliminira, šanse zaokruživanja pogrešaka ili druge nepreciznosti koje mogu uzrokovati probleme u drugim dijelovima programa. Mnoge matematičke funkcije ili operateri pretvaraju i vraćaju Dvaput, tako da ne morate baciti brojeve natrag na Float jer bi to moglo izgubiti preciznost. Za detaljnu analizu aritmetike s pomičnim zarezom preporučujem vam da pročitate ovaj strašan članak (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Sažetak

Pa … ukratko:

Mjesta na kojima biste trebali upotrebljavati Float:

  • Ako ciljate hardver u kojem je jedna preciznost brža od dvostruke preciznosti.
  • Vaša aplikacija teška upotreba aritmetike s pomičnim zarezom, poput tisuća brojeva s tisućama 0-ih.
  • Radite vrlo nisku razinu optimizacije. Na primjer, koristite posebne upute za CPU (tj. SSE, SSE2, AVX itd.) Koje djeluju na više brojeva / polja / vektora odjednom.

Zaključak

U ovom članku naglasio sam razliku između Floata i Doublea i koji bi trebao biti korišten na određenim mjestima. Vjerojatno je bolje koristiti Double na većini mjesta slijepo, pogotovo ako ciljate moderna računala, jer je vjerojatnost niske učinkovitosti zbog korištenja aritmetičkih podataka s Double Floating Point vrlo malo vjerojatno. Ako imate bilo kakvih pitanja, možete pitati u odjeljku komentara u nastavku!