Rozdiel medzi plavákami a dvojitými - ktorý z nich by som mal použiť?

(Poznámka: Tento článok predpokladá, že čitatelia vedia o základoch informatiky)

Mnoho nováčikov / programátorov / študentov, ktorí sú zapísaní v informatike, kladú často kladené otázky, ktoré sú relevantné pre konkrétnu oblasť informatiky, ktorú študujú. Väčšina kurzov pre začiatočníkov sa začína témami číselného systému, ktorý sa používa v moderných počítačoch vrátane internetu dvojitý, desatinný, osmičkové a hexadecimálne Systém. Jedná sa o formáty čísel počítačov, ktoré sú interným znázornením číselných hodnôt v počítačoch (alebo kalkulačkách a iných digitálnych počítačoch). Tieto hodnoty sa ukladajú ako „zoskupenie bitov“.

Ako vieme, počítače predstavujú údaje v množinách binárnych číslic (t. J. V kombinácii 1s a 0s, ako napr, 1111 zastupuje 15 v desiatkovej sústave), má zmysel učiť sa o rôznych formátoch čísel, ktoré sa používajú na reprezentovanie dynamického rozsahu hodnôt, pretože vytvárajú základné bloky spracovania výpočtov / čísel v akejkoľvek operácii. Akonáhle je číselný systém v triede definovaný (často zle), sú študenti v pokušení prejsť na rôzne formáty čísel v rovnakom type (t. J.., aritmetika s pohyblivou rádovou čiarkou), ktoré majú určitú presnosť a rozsah čísel. Sú teda nútení naučiť sa nuansy medzi určitými typmi. Dva z najbežnejšie používaných typov údajov sú Plavák a dvojitý, a zatiaľ čo sa zameriavajú na rovnaké potreby (t., aritmetika s pohyblivou rádovou čiarkou), existuje pomerne veľký rozdiel v ich vnútornej reprezentácii a celkovom vplyve na výpočet v programe. Je smutné, že mnohým programátorom chýbajú nuansy medzi typmi údajov typu Flat a Double a nakoniec ich zneužívajú na miestach, kde by sa na prvom mieste nemali používať. V konečnom dôsledku to vedie k nesprávnym výpočtom v iných častiach programu.

V tomto článku vám poviem rozdiel medzi plavákom a dvojnásobkom s príkladmi kódu v programovacom jazyku C. Začnime!

Float vs Double ... Čo sa deje?

Float a Double sú reprezentácie údajov, ktoré sa používajú pre aritmetické operácie s pohyblivou rádovou čiarkou. Spomeňte na desatinné čísla, ktoré vypočítate v triede matematiky, napríklad, 20,123, 16.23, 10.2, atď., nie sú to celé čísla (t. j., 2, 5, 15, atď.), preto vyžadujú zváženie zlomkov v binárnom formáte. Ako výsledné desatinné číslo (t., 20,123, 16.23, atď.) sa nedajú ľahko reprezentovať v normálnom binárnom formáte (t. j. Integer). Hlavným rozdielom medzi Float a Double je to, že prvé dáta sú údaje s plávajúcou desatinnou čiarkou s jednoduchou presnosťou (32-bitové údaje), zatiaľ čo druhé dáta sú údaje s plávajúcou desatinnou čiarkou s jednoduchou presnosťou (64-bitové). Double sa nazýva „double“, pretože v podstate ide o verziu Float s dvojitou presnosťou. Ak počítate obrovské množstvo (premýšľajte o tisícoch 0), nepresnosti budú menšie v Double a nestratíte veľkú presnosť..

Je lepšie rozpracovať pomocou príkladov kódu. Nasleduje operácia Float a Double pomocou matematických funkcií poskytovaných v jazyku C:

#include

int main ()

float num1 = 1.f / 82;

float num2 = 0;

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

num2 + = num1;

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

double num3 = 1,0 / 82;

dvojité číslo 4 = 0;

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

num4 + = num3;

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

getchar ();

Vytlačí nasledujúce:

9.000031

8,99999999999983

Tu vidíte, že mierny rozdiel v presnosti funkcie Float a Double dáva úplne inú odpoveď, aj keď sa zdá, že Double je presnejšia ako funkcia Float..

Nasleduje príklad funkcie sqrt () v jazyku C:

#include

#include

int main ()

float num1 = sqrt (2382719676512365.1230112312312312);

double num2 = sqrt (2382719676512365.1230112312312312);

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

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

getchar ();

Poskytuje nasledujúci výstup:

48813108.000000

48813109.678778

Tu vidíte, že odpoveď v Double má lepšiu presnosť.

Celkovo je lepšie použiť Double pre aritmetiku s pohyblivou rádovou čiarkou, pretože niekoľko štandardných matematických funkcií v C pracuje na Double a moderné počítače sú extrémne rýchle a efektívne pre výpočty Double floating-point. To vedie k zníženiu potreby používať Float, pokiaľ nepotrebujete pracovať na mnohých číslach s plávajúcou desatinnou čiarkou (myslieť na veľké polia s číslami v počte 0) alebo ak operujete na systéme, ktorý nepodporuje dvojité- presnosť s pohyblivou desatinnou čiarkou, pretože mnoho GPU, nízko napájané zariadenia a určité platformy (ARM Cortex-M2, Cortex-M4 atď.) zatiaľ nepodporujú Double, mali by ste použiť Float. Ďalej si treba pamätať na to, že určité GPU / CPU pracujú lepšie alebo efektívnejšie pri spracovaní Float, napríklad pri výpočte vektorov / matíc, takže možno budete musieť vyhľadať príručku alebo dokumentáciu k hardvérovej špecifikácii, aby ste sa lepšie rozhodli, ktorý z nich by ste mali použiť. pre konkrétny stroj.

Existuje zriedka dôvod na použitie funkcie Float namiesto Double v kóde zacielenom na moderné počítače. Extra presnosť v programe Double znižuje, ale neodstraňuje, možnosť zaokrúhľovania chýb alebo inú nepresnosť, ktorá môže spôsobiť problémy v iných častiach programu. Mnoho matematických funkcií alebo operátorov prevádza a vracia Double, takže čísla nemusíte prenášať späť na Float, pretože by to mohlo stratiť presnosť. Pre podrobnú analýzu aritmetiky s pohyblivou rádovou čiarou vám dôrazne odporúčame prečítať si tento úžasný článok (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)..

zhrnutie

Takže ... v skratke:

Miesta, kde by ste mali používať Float:

  • Ak zacieľujete na hardvér, pri ktorom je presnosť jednoduchá ako dvojitá presnosť.
  • Vaša aplikácia intenzívne využíva aritmetiku s pohyblivou rádovou čiarkou, napríklad tisíce čísel s tisíckami 0.
  • Robíte veľmi nízkoúrovňovú optimalizáciu. Napríklad používate špeciálne inštrukcie CPU (t. J. SSE, SSE2, AVX, atď.), Ktoré fungujú súčasne na viacerých číslach / poliach / vektoroch..

záver

V tomto článku som zdôraznil rozdiel medzi Floatom a Double, ktorý by sa mal použiť na konkrétnych miestach. Pravdepodobne je lepšie používať Double na väčšine miest naslepo, najmä ak sa zameriavate na moderné počítače, pretože pravdepodobnosť nízkej účinnosti v dôsledku používania aritmetiky s plávajúcou desatinnou čiarkou je veľmi nepravdepodobná. Ak máte nejaké otázky, môžete sa ich spýtať v sekcii komentárov nižšie!