Rozdíl mezi Float a Double - Který z nich bych měl použít?

(Poznámka: Tento článek předpokládá, že čtenáři vědí o základech informatiky)

Mnoho nováčků programátorů / studentů, kteří jsou zapsáni v informatice, klade často kladené otázky, které jsou relevantní pro konkrétní obor v oblasti informatiky, který studují. Většina kurzů pro začátečníky začíná tématy číselného systému, který se používá v moderních počítačích, včetně binární, desetinný, osmičkový a hexadecimální Systém. Jedná se o formáty čísel počítačů, které jsou interními reprezentacemi číselných hodnot v počítačích (nebo kalkulačkách a jiných digitálních počítačích). Tyto hodnoty jsou uloženy jako „seskupování bitů“.

Jak víme, počítače představují data v sadách binárních číslic (tj. V kombinaci 1s a 0 s, jako, 1111 představuje 15 v desítkovém systému), má smysl učit se o různých formátech čísel, které se používají k reprezentaci dynamického rozsahu hodnot, protože vytvářejí základní bloky zpracování výpočtu / čísla při jakémkoli druhu operace. Jakmile je číselný systém definován ve třídě (často špatně), jsou studenti v pokušení přejít na různé formáty čísel ve stejném typu (tj.., aritmetika s pohyblivou řádovou čárkou), které mají určitou přesnost a rozsah čísel. Jsou tedy nuceni se učit nuanci mezi určitými typy. Dva z nejčastěji používaných typů dat jsou Plovák a Dvojnásobek, a zatímco se zaměřují na stejné potřeby (tj., aritmetika s pohyblivou řádovou čárkou), existuje docela rozdíl v jejich vnitřní reprezentaci a celkovém vlivu na výpočet v programu. Je nešťastné, že mnoho programátorů vynechává nuance mezi datovými typy typu Flat a Double a nakonec je zneužívá v místech, kde by nemělo být vůbec použito. Nakonec to vede k nesprávnému výpočtu v jiných částech programu.

V tomto článku vám řeknu rozdíl mezi float a double s příklady kódu v programovacím jazyce C. Začněme!

Float vs Double ... Co se děje?

Float a Double jsou reprezentace dat, které se používají pro aritmetické operace s plovoucí desetinnou čárkou. Přemýšlejte o desetinných číslech, která vypočítáte ve třídě matematiky, například, 20,123, 16.23, 10.2, atd., nejedná se o celá čísla (tj., 2, 5, 15, atd.), proto vyžadují zohlednění zlomků v binárním souboru. Jako výsledná desetinná čísla (tj., 20,123, 16.23, atd.) nelze snadno reprezentovat v normálním binárním formátu (tj. Integer). Hlavní rozdíl mezi Floatem a Double je ten, že data jsou data s plovoucí desetinnou čárkou s přesnou přesností (32 bitů), zatímco druhá data jsou datový typ s plovoucí desetinnou čárkou s dvojitou přesností (64 bitů). Double se nazývá „double“, protože se jedná o verzi Float s dvojitou přesností. Pokud počítáte obrovské množství (vezměte v úvahu tisíce 0 v počtu), pak nepřesnosti budou v Double dvojnásobné a neztratíte moc přesnosti.

Je lepší zpracovat pomocí příkladů kódu. Následuje operace Float a Double pomocí matematických funkcí poskytovaných v jazyce C:

#zahrnout

int main ()

float num1 = 1.f / 82;

float num2 = 0;

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

num2 + = num1;

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

double num3 = 1,0 / 82;

double num4 = 0;

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

num4 + = num3;

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

getchar ();

Vytiskne následující:

9,000031

8.99999999999983

Zde vidíte, že malý rozdíl v přesnosti Float a Double dává úplně jinou odpověď, i když Double se zdá být přesnější než Float.

Následuje příklad funkce sqrt () v C:

#zahrnout

#zahrnout

int main ()

float num1 = sqrt (2382719676512365.1230112312312312);

double num2 = sqrt (2382719676512365.1230112312312312);

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

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

getchar ();

Poskytuje následující výstup:

48813108,000000

48813109,678778

Zde vidíte, že odpověď ve službě Double má lepší přesnost.

Celkově je lepší použít Double pro aritmetiku s pohyblivou řádovou čárkou, protože několik standardních matematických funkcí v C pracuje na Double a moderní počítače jsou extrémně rychlé a efektivní pro výpočty Double floating-point. To vede ke snížení potřeby používat Float, pokud nepotřebujete pracovat na mnoha číslech s pohyblivou desetinnou čárkou (například na velká pole s tisíci 0 v číslech) nebo pokud pracujete na systému, který nepodporuje dvojité- přesnost s pohyblivou řádovou čárkou, protože mnoho GPU, zařízení s nízkým výkonem a určité platformy (ARM Cortex-M2, Cortex-M4 atd.) zatím nepodporují Double, měli byste použít Float. Kromě toho je třeba si pamatovat, že určité GPU / CPU pracují lépe / efektivně ve Floatově zpracování, jako je tomu ve výpočtu vektorů / matic, takže možná budete muset hledat v manuálu / dokumentaci k hardwarové specifikaci, abyste se lépe rozhodli, který z nich byste měli použít. pro konkrétní stroj.

Existuje zřídka důvod použít Float namísto Double v kódu zaměřeném na moderní počítače. Extra přesnost ve službě Double snižuje, ale nevylučuje, šanci zaokrouhlování chyb nebo jiné nepřesnosti, které mohou způsobit problémy v jiných částech programu. Mnoho matematických funkcí nebo operátorů převádí a vrací Double, takže nemusíte odevzdávat čísla zpět do Float, protože by to mohlo ztratit přesnost. Pro podrobnou analýzu aritmetiky s pohyblivou řádovou čárkou vřele doporučujeme přečíst si tento úžasný článek (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

souhrn

Takže… v kostce:

Místa, kde byste měli používat Float:

  • Pokud cílíte na hardware, kde je jednoduchá přesnost rychlejší než dvojitá přesnost.
  • Vaše aplikace intenzivně využívá aritmetiku s pohyblivou řádovou čárkou, jako jsou tisíce čísel s tisíci 0.
  • Děláte velmi nízkou úroveň optimalizace. Používáte například speciální instrukce CPU (tj. SSE, SSE2, AVX atd.), Které pracují na více číslech / polích / vektorech najednou.

Závěr

V tomto článku jsem zdůraznil rozdíl mezi Floatem a Double a který by měl být použit na konkrétních místech. Pravděpodobně je lepší použít Double na většině míst slepě, zejména pokud cílíte na moderní počítače, protože šance na nízkou účinnost díky použití aritmetiky s pohyblivou desetinnou čárkou je vysoce nepravděpodobná. Pokud máte nějaké dotazy, můžete se zeptat v sekci komentářů níže!