Razlika med plovcem in dvojno - katero naj uporabim?

(Opomba: Ta članek predvideva, da bralci poznajo osnove računalništva)

Številni začetniki programerji / študentje, ki so vpisani v računalništvo, postavljajo pogosto zastavljena vprašanja, ki so pomembna za določeno področje računalništva, ki ga študirajo. Večina začetnih tečajev se začne s temami številskega sistema, ki se uporablja v sodobnih računalnikih, vključno s binarni, decimalno, oktalno in šestnajstiški sistem. To so formati računalniških številk, ki so notranja predstavitev številskih vrednosti v računalnikih (ali kalkulatorjih in vseh drugih vrstah digitalnih računalnikov). Te vrednosti so shranjene kot "združevanje bitov".

Kot vemo, računalniki predstavljajo podatke v nizih binarnih števk (tj. V kombinaciji 1s in 0s, kot naprimer, 1111 predstavlja 15 v decimalnem sistemu) je smiselno poučiti o različnih oblikah števil, ki se uporabljajo za predstavljanje dinamičnega razpona vrednosti, saj tvorijo osnovne bloke izračuna / števila obdelave pri kateri koli operaciji. Ko je v učilnici definiran sistem številk (pogosto slabo), se učenci zamikajo, da se premaknejo na različne oblike števila znotraj iste vrste (tj.., aritmetika s plavajočo vejico), ki imajo določeno natančnost in obseg števil. Tako so se prisiljeni naučiti nianse med določenimi vrstami. Dve najpogosteje uporabljeni vrsti podatkov sta Plovec in Dvojna, in medtem ko ciljajo na iste potrebe (tj., aritmetika s plavajočo vejico), obstaja kar nekaj razlik v njihovi notranji zastopanosti in splošnem vplivu na izračun v programu. Na žalost mnogi programerji pogrešajo nianse med podatkovnimi vrstami Flat in Double in jih na koncu zlorabljajo na mestih, kjer jih sploh ne bi smeli uporabljati. Posledica tega je bilo napačnih izračunov v drugih delih programa.

V tem članku vam bom povedal razliko med float in double s primeri kod v programskem jeziku C. Začnimo!

Float vs Double ... Kakšen dogovor?

Float in Double sta predstavitev podatkov, ki se uporabljajo za aritmetične operacije s plavajočo vejico, pomislite na decimalna števila, ki jih izračunate v matematičnem razredu, kot je npr., 20.123, 16.23, 10.2, itd., niso cele številke (tj., 2, 5, 15, itd.), zato zahtevajo upoštevanje ulomkov v binarni obliki. Kot dobljene decimalne številke (t.j.., 20.123, 16.23, itd.) ni mogoče preprosto predstaviti z normalno binarno obliko (tj. celo število). Glavna razlika med Float in Double je v tem, da je prvi podatek o plavajoči točki z eno natančnostjo (32-bitni), medtem ko je drugi podatkovni tip plavajoče točke z dvojno natančnostjo (64-bitni). Double se imenuje "double", ker je v bistvu dvojna natančnost različice Float. Če računate ogromno (pomislite na tisoč 0-ih v številu), bodo netočnosti v Double-u manjše in ne boste izgubili veliko natančnosti.

Bolje je, da razložite z uporabo kodnih primerov. Sledi delovanje Float in Double s pomočjo matematičnih funkcij v jeziku C:

#include

int main ()

plovec num1 = 1.f / 82;

float num2 = 0;

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

num2 + = num1;

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

dvojna številka3 = 1,0 / 82;

dvojno število4 = 0;

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

num4 + = num3;

printf ("%. 15g \ n", številka 4);

getchar ();

Natisne naslednje:

9.000031

8.99999999999983

Tu lahko vidite, da rahla razlika v natančnosti Float-a in Double-a daje povsem drugačen odgovor, čeprav se zdi, da je Double natančnejši kot Float.

Sledi primer funkcije sqrt () v C:

#include

#include

int main ()

float num1 = sqrt (2382719676512365.1230112312312312);

dvojna num2 = sqrt (2382719676512365.1230112312312312);

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

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

getchar ();

Daje naslednji izhod:

48813108.000000

48813109.678778

Tu lahko vidite, da je odgovor v dvojni boljši.

Skupno je za aritmetiko s plavajočo vejico Double uporabiti več, saj več standardnih matematičnih funkcij v C deluje na dvojnih, sodobni računalniki pa so izjemno hitri in učinkoviti za dvojne izračune s plavajočo vejico. To vodi do zmanjšanja potrebe po uporabi Float-a, razen če morate delovati na številnih številkah s plavajočo vejico (pomislite na velike matrike z več tisoč številk 0) ali če delujete v sistemu, ki ne podpira dvojnega oz. natančnost plavajoče točke, saj veliko GPU-jev, naprav z nizko porabo energije in določenih platform (ARM Cortex-M2, Cortex-M4 itd.) še ne podpira Double, potem morate uporabiti Float. Poleg tega si je treba zapomniti eno stvar, da nekateri GPU / CPU delujejo boljše / učinkovite pri obdelavi Float, kot pri izračunu vektorjev / matrike, zato boste morda morali prebrati priročnik / dokumentacijo za strojno opremo, da se boste lažje odločili, katerega naj uporabljate za določen stroj.

Redko je razlog, da v kodi, ki cilja sodobne računalnike, uporabite Float namesto Double. Dodatna natančnost Double-a zmanjšuje, vendar ne odpravlja, možnosti zaokroževanja napak ali druge natančnosti, ki lahko povzroči težave v drugih delih programa. Mnoge matematične funkcije ali operaterji Double in pretvorijo in vrnejo Double, zato vam ni treba, da številke vržete v Float, saj lahko to izgubi natančnost. Za podrobno analizo aritmetike s plavajočo vejico toplo priporočam, da preberete ta super članek (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Povzetek

Torej… na kratko:

Mesta, kjer bi morali uporabljati Float:

  • Če ciljate na strojno opremo, pri kateri je enojna natančnost hitrejša od dvojne.
  • Vaša aplikacija pogosto uporablja aritmetiko s plavajočo vejico, na primer na tisoče števil z tisoč 0.
  • Izvajate zelo nizko raven optimizacije. Na primer, uporabljate posebna navodila za CPU (tj. SSE, SSE2, AVX itd.), Ki delujejo na več številkah / nizih / vektorjih hkrati.

Zaključek

V tem članku sem izpostavil razliko med Float in Double in katero naj bi uporabljali na določenih mestih. Zagotovo je Double v večini krajev bolje uporabljati na slepo, še posebej, če ciljate na sodobne računalnike, saj so možnosti nizke učinkovitosti zaradi uporabe aritmetike Double s plavajočo vejico zelo malo verjetne. Če imate kakršna koli vprašanja, lahko to postavite v spodnjem razdelku za komentarje!