Diferența dintre float și dublu - care ar trebui să folosesc?

(Notă: Acest articol presupune că cititorii știu despre elementele de bază ale informaticii)

Mulți programatori newbie / studenți care sunt înscriși în Computer Science întreabă întrebările frecvente care sunt relevante pentru domeniul special în cadrul științei informatice pe care o studiază. Majoritatea cursurilor de începători încep cu subiectele sistemului numeric care se utilizează în computerele moderne, inclusiv în binar, zecimal, octal și hexazecimal sistem. Acestea sunt formatele numărului de computer care reprezintă reprezentările interne ale valorilor numerice în computere (sau calculatoare și orice alt tip de computere digitale). Aceste valori sunt stocate ca "gruparea de biți".

După cum știm, computerele reprezintă date în seturi de cifre binare (adică, în combinație de 1s și 0s, precum, 1111 reprezintă 15 în sistemul zecimal), este logic să predați diferitele formate de numere care sunt folosite pentru a reprezenta un interval dinamic de valori, deoarece ele formează blocurile de bază ale procesării de calcul / număr în orice fel de operațiune. Odată ce sistemul de numere este definit în sala de clasă (adesea prost), elevii sunt tentați să se mute pe diferitele formate de numere din același tip (adică., aritmetica punctului de varf) care au o anumită precizie și un interval de numere. Astfel, ei sunt forțați să învețe nuanțele între anumite tipuri. Două dintre cele mai frecvent utilizate tipuri de date sunt Pluti și Dubla, și în timp ce vizează aceleași nevoi (de ex., aritmetica punctului de varf), există o oarecare diferență în ceea ce privește reprezentarea lor internă și efectul general asupra calculului din program. Este regretabil faptul că mulți programatori ratează nuanțele dintre tipurile de date Flat și Double și ajung să le abuzeze în locuri unde nu ar trebui folosite în primul rând. În cele din urmă rezultă în calcularea greșelilor în alte părți ale programului.

În acest articol, vă voi spune diferența dintre float și dublu cu exemplele de cod în limba de programare C. Să începem!

Float vs. Double ... Care e treaba?

Float și Double reprezintă reprezentarea datelor care sunt utilizate pentru operațiile aritmetice cu punct de plutire, gândiți-vă la numerele zecimale pe care le calculați în clasa matematică, cum ar fi, 20.123, 16,23, 10.2, etc, nu sunt numere întregi (adică., 2, 5, 15, etc), astfel necesită luarea în considerare a fracțiunilor în binar. Ca numere zecimale rezultate (adică., 20.123, 16,23, etc) nu pot fi reprezentate ușor cu un format binar normal (adică Integer). Principala diferență dintre Float și Double este aceea că prima este o singură dată de precizie (32 de biți), în timp ce cea de-a doua este tipul de date cu virgulă dublă de precizie (64 biți). Dublul se numește "dublu", deoarece este o versiune dublă de precizie a lui Float. Dacă calculați o sumă imensă (gândiți-vă la mii de cifre în număr), atunci inexactitățile vor fi mai mici în Double și nu veți pierde multă precizie.

Este mai bine să elaborați folosind exemplele de cod. Următoarea este operațiunea Float și Double prin intermediul funcțiilor matematice furnizate în limba C:

#include

int main ()

float num1 = 1.f / 82;

float num2 = 0;

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

num2 + = num1;

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

dublă num3 = 1,0 / 82;

dublă num4 = 0;

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

num4 + = num3;

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

getchar ();

Se imprimă următoarele:

9.000031

8.99999999999983

Aici, puteți observa că diferența ușoară în precizia Float și Double oferă un răspuns diferit, deși Double pare să fie mai precis decât Float.

Următorul este exemplul funcției sqrt () în C:

#include

#include

int main ()

float num1 = sqrt (2382719676512365.1230112312312312);

dublă num2 = sqrt (2382719676512365.1230112312312312);

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

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

getchar ();

Oferă următoarea ieșire:

48813108.000000

48813109.678778

Aici, puteți vedea că răspunsul la dublu are o precizie mai bună.

În general, este mai bine să utilizați dublu pentru aritmetica cu virgulă mobilă, deoarece mai multe funcții matematice standard din C funcționează pe computerele duble și moderne sunt extrem de rapide și eficiente pentru calculele duble cu virgulă mobilă. Acest lucru duce la reducerea nevoii de a utiliza Float, cu excepția cazului în care este necesar să operezi pe o mulțime de numere în virgulă mobilă (gândiți-vă la matrice mari cu mii de cifre în numere) sau dacă lucrați într-un sistem care nu acceptă operații de dublu- punct de virgulă precizie, cât mai multe unități de procesare grafică, dispozitive cu putere redusă și anumite platforme (ARM Cortex-M2, Cortex-M4 etc.) nu acceptă încă Double, atunci ar trebui să utilizați Float. În plus, un lucru de reținut este faptul că anumite unități de procesare grafică / procesoare funcționează mai bine / mai eficient în procesarea flotorului, ca și în calculul vectorilor / matricei, astfel încât ar putea fi necesar să vă uitați în manualul / documentația specificațiilor hardware pentru a decide mai bine care dintre ele ar trebui să utilizați pentru o anumită mașină.

Există rareori un motiv să utilizați funcția Float în loc de Double în codul care vizează computerele moderne. Precizia suplimentară în Double reduce, dar nu elimină, șansele de rotunjire a erorilor sau a altor imprecizii care pot cauza probleme în alte părți ale programului. Multe funcții matematice sau operatori convertesc și returnează Double, deci nu este nevoie să aruncați numerele înapoi la Float, deoarece acestea ar putea pierde precizia. Pentru o analiză detaliată a aritmeticii în virgulă mobilă, vă recomand să citiți acest articol minunat (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

rezumat

Deci ... pe scurt:

Locuri unde ar trebui să utilizați Float:

  • Dacă vizează hardware în care precizia unică este mai rapidă decât dubla precizie.
  • Aplicația dvs. utilizează în mod greu aritmetica cu puncte de plutire, cum ar fi mii de numere cu mii de cifre.
  • Faceți o optimizare la un nivel foarte scăzut. De exemplu, utilizați instrucțiuni speciale de procesor (adică SSE, SSE2, AVX etc.) care funcționează pe mai multe numere / array / vectori simultan.

Concluzie

În acest articol am subliniat diferența dintre Float și Double și care ar trebui să fie folosit în anumite locuri. În mod evident, este mai bine să utilizați Double în majoritatea locurilor orbește, mai ales dacă vizează computere moderne, deoarece șansele de eficiență scăzută datorate utilizării aritmeticii cu dublă valoare plutitoare este foarte puțin probabil. Dacă aveți întrebări, puteți întreba în secțiunea de comentarii de mai jos!