Float And Double - Který z nich mám použít?

Anonim

(Poznámka: Tento článek předpokládá, že čtenáři vědí o základy počítačové vědy)

Mnoho začínajících programátorů / studentů, kteří jsou zapsáni v oboru informatiky, požádá o často kladené otázky, které jsou relevantní pro konkrétní oblast v oboru informatiky, kterou studují. Většina začátečních kurzů 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 počítačových čísel, které jsou interními reprezentacemi číselných hodnot v počítačích (nebo kalkulačích a jiných druzích digitálních počítačů). Tyto hodnoty jsou uloženy jako "seskupení bitů".

Jak víme, počítače reprezentují data v sadách binárních číslic (tj. V kombinaci s 1s a 0s, 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 tvoří všechny základní bloky zpracování výpočtů / čísel v jakémkoli druhu provozu. Jakmile je číselný systém definován ve třídě (často špatně), jsou studenti pokoušeni přesunout se na různé formáty čísel v rámci stejného typu (tj. plovoucí aritmetika ), které mají určitou přesnost a rozsah čísel. Proto jsou nuceni učit se nuance mezi určitými typy. Dva nejběžněji používané datové typy jsou Plovák a Dvojnásobek , a zatímco se zaměřují na stejné potřeby (tj. plovoucí aritmetika ), existují poměrně málo rozdíly v jejich interním zastoupení a celkový vliv na výpočet v programu. Je to nešťastné, že mnoho programátorů postrádá nuance mezi datovými typy typu Flat a Double a nakonec je zneužívá na místech, kde by neměli být použity na prvním místě. Nakonec vedly k chybné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ódů v C programovacím jazyce. Začněme!

Float vs. Double … Co je to dohoda?

Float a Double jsou reprezentace dat, která se používají pro aritmetické operace s plovoucí desetinnou čárkou, přemýšlejte o desítkových číslech, která vypočítáte v matematické třídě, 20.123, 16.23, 10.2, atd., nejsou celá čísla (tj. 2, 5, 15, atd.), proto vyžadují zohlednění frakcí v binárně. Jako výsledné desetinné číslo (tj. 20.123, 16.23, atd.) nelze snadno znázornit normálním binárním formátem (tj. Integer). Hlavním rozdílem mezi Float a Double je to, že bývalý je jediný přesný (32-bitový) dat plovoucího bodu, zatímco druhý je datový typ s dvojitou přesností (64 bitů) s plovoucí čárou. Double je nazýván "double", protože je to v podstatě verze s dvojitou přesností Float. Pokud vypočítete obrovské množství (uvažte tisíce čísel 0 v čísle), pak budou nepřesnosti v Double a menší ztráta přesnosti.

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

#zahrnout

int hlavní () {

float num1 = 1.f / 82;

float num2 = 0;

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

num2 + = num1;

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

dvojité číslo3 = 1,0 / 82;

double num4 = 0;

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

num4 + = num3;

printf ("%. 15g n", číslo4);

getchar ();

}

Vytiskne následující:

9.000031

8.99999999999983

Zde vidíte, že mírný rozdíl v přesnosti Float a Double poskytuje zcela jinou odpověď, i když Double vypadá, že je přesnější než Float.

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

#zahrnout

#zahrnout

int hlavní () {

float num1 = sqrt (2382719676512365.1230112312312312);

dvojitý num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

getchar ();

}

Poskytuje následující výstup:

48813108.000000

48813109.678778

Zde můžete vidět, že odpověď v Double má lepší přesnost.

Celkově je lepší použít Double pro plovoucí aritmetiku, neboť několik standardních matematických funkcí v C funguje na dvojitých a moderních počítačích jsou extrémně rychlé a efektivní pro výpočty s dvojitým pohyblivým bodem. To vede ke snížení potřeby používat Float, pokud nepotřebujete pracovat s mnoha čísly s plovoucí desetinnou čárkou (přemýšlejte o velkých polích s tisíci číslic 0) nebo pracujete na systému, (ARM Cortex-M2, Cortex-M4 atd.) nepodporují Double, pak byste měli používat Float. Dále je třeba pamatovat na to, že určité procesory GPU / procesory pracují lépe a účinněji v oblasti zpracování plaveb, například při výpočtu vektorů / matic, takže byste se měli podívat v manuálu / dokumentaci k hardwaru, abyste mohli lépe rozhodnout, který z nich byste měli použít pro konkrétní stroj.

Zřídka existuje důvod, proč se v kódu, který je zaměřen na moderní počítače, použije Float namísto Double.Zvláštní přesnost v programu Double snižuje, ale nevylučuje šance na zaokrouhlení nebo jiné nepřesnosti, které mohou způsobit problémy v jiných částech programu. Mnoho matematických funkcí nebo operátorů konvertuje a vrací Double, takže nemusíte přenášet čísla zpět do Float, protože by to mohlo ztratit přesnost. Pro podrobnou analýzu aritmetiky s plovoucí čárou doporučuji přečíst 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 jednorozměrnost rychlejší než dvojnásobná přesnost.
  • Vaše aplikace používá těžké aritmetiky s plovoucí desetinnou čárkou, jako jsou tisíce čísel s tisíci číslic.
  • Děláte velmi nízkou úroveň optimalizace. Používáte například speciální instrukce CPU (tj. SSE, SSE2, AVX atd.), Které fungují na více číslech / polích / vektorech najednou.

Závěr

V tomto článku jsem zdůraznil rozdíl mezi Float a Double a který z nich 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ístně slepě, zvláště pokud se zaměřujete na moderní počítače, protože pravděpodobnost nízké efektivity díky použití aritmetiky s dvojím pohyblivým bodem je velmi nepravděpodobná. Pokud máte nějaké dotazy, můžete se zeptat v sekci komentáře níže!