Ve svých programátorských zkušenostech se často musím rozhodnout, zda bych měl použít float nebo double pro svůj skutečný čísla. Někdy jdu na float, jindy na double, ale ve skutečnosti mi to připadá subjektivnější. Kdybych byl konfrontován s obhajobou svého rozhodnutí, asi bych neuváděl rozumné důvody.

Kdy používáte float a kdy používáte double? Používáte vždy dvojnásobek, pouze když jsou přítomna paměťová omezení, jdete na float? Nebo použijete vždy float, pokud požadavek na přesnost nevyžaduje použití double? Existují nějaké podstatné rozdíly, pokud jde o výpočetní složitost základních aritematik mezi floatem a double? Jaké jsou výhody a nevýhody používání float nebo double? A už jste dokonce použili dlouhý dvojitý?

Komentáře

  • V mnoha případech nechcete použít ani jeden, ale spíše desetinný plovoucí nebo pevný bod. Binární typy s plovoucí desetinnou čárkou nemohou ‚ t přesně představovat většinu desetinných míst.
  • Souvisí s Co způsobuje chyby zaokrouhlování s plovoucí desetinnou čárkou ? . @CodesInChaos moje odpověď navrhuje zdroje, které vám pomohou provést toto rozhodnutí, neexistuje řešení univerzální .
  • Co přesně myslíte pod “ desetinnými místy „. Pokud potřebujete přesně reprezentovat hodnoty jako 0,01 (řekněme pro peníze), pak (binární) s plovoucí desetinnou čárkou není odpověď. Pokud máte na mysli pouze neceločíselná čísla, pak je plovoucí desetinná čárka pravděpodobně v pořádku – ale “ desetinná místa “ není to nejlepší slovo k popisu toho, co potřebujete.
  • Vzhledem k tomu, že (od dnešního dne) většina grafických karet přijímá plováky přes zdvojnásobení, programování grafiky často používá jedinou přesnost.
  • Nepoužijete ‚ Vždy máte na výběr. Například na platformě Arduino se double i float rovná floatu. Musíte najít doplňkovou knihovnu pro zpracování skutečných zdvojnásobení.

Odpověď

Výchozí volba pro typ s plovoucí desetinnou čárkou by měl být double. Toto je také typ, který získáte s literály s plovoucí desetinnou čárkou bez přípony nebo (v C) se standardními funkcemi, které pracují s čísly s plovoucí desetinnou čárkou (např. exp, sin atd.).

float by měl být použit pouze v případě, že potřebujete pracovat s mnoha čísly s plovoucí desetinnou čárkou (zvažte řádově tisíce a více) a analýza algoritmu ukázala, že snížený rozsah a přesnost nepředstavují problém.

long double lze použít, pokud potřebujete větší rozsah nebo přesnost než double, a pokud to poskytuje na vaší cílové platformě.

Souhrnně float a long double by měly být vyhrazeny pro použití odborníky, double pro „každodenní“ použití.

Komentáře

  • Pravděpodobně bych nepovažoval float za několik tisíc hodnot, pokud by nenastal problém s výkonem souvisejícím s plovoucí desetinnou čárkou ga přenos dat. Analýza obvykle vyžaduje značné náklady, aby se ukázalo, že float je dostatečně přesný.
  • Jako dodatek, pokud potřebujete kompatibilitu s jinými systémy, může být výhodné použít stejné datové typy.
  • I ‚ d používám plováky pro miliony čísel, ne 1000 s. Některým GPU se také lépe daří s plováky, v tom speciálním případě použijte plováky. Jinak, jak říkáte, použijte zdvojnásobení.
  • @PatriciaShanahan – ‚ problém s výkonem související s .. ‚ A dobrým příkladem je, pokud plánujete použít SSE2 nebo podobné vektorové instrukce, můžete udělat 4 operace / vektor v floatu (proti 2 za double), což může přinést výrazné zlepšení rychlosti (o polovinu více operací a o polovinu více dat ke čtení & zápis). To může výrazně snížit prahovou hodnotu, kde se používání plováků stává atraktivním, a stojí za to vyřešit číselné problémy.
  • Podporuji tuto odpověď jednou další radou: Když člověk pracuje s hodnotami RGB pro zobrazení, je přijatelné použít float (a občas s poloviční přesností), protože ani lidské oko, displej ani barevný systém nemají tolik přesnosti. Tato rada je použitelná například pro OpenGL atd. Tato další rada se nevztahuje na lékařské snímky, které mají přísnější požadavky na přesnost.

Odpovědět

Zřídka se v kódu cíleném na moderní počítače používá float místo double. Mimořádná přesnost snižuje (ale nevylučuje) pravděpodobnost zaokrouhlování chyb nebo jiné nepřesnosti způsobující problémy.

Mezi hlavní důvody, proč mohu použít float, patří:

  1. Ukládáte velká pole čísel a potřebujete snížit spotřebu paměti vašeho programu.
  2. Cílíte na systém, který nativně nepodporuje plovoucí desetinnou čárku s dvojitou přesností. Až donedávna mnoho grafických karet podporovalo pouze plovoucí desetinné čárky s přesnou přesností. Jsem si jist, že existuje spousta procesorů s nízkou spotřebou a vestavěných procesorů, které mají také omezenou podporu s plovoucí desetinnou čárkou.
  3. Cílíte na hardware, kde je jednoduchá přesnost rychlejší než dvojnásobná a vaše aplikace hodně využívá aritmetiky s plovoucí desetinnou čárkou. Na moderních procesorech Intel se domnívám, že všechny výpočty s plovoucí desetinnou čárkou jsou prováděny s dvojitou přesností, takže zde nic nezískáte.
  4. Děláte nízkoúrovňovou optimalizaci, například pomocí speciálních instrukcí CPU, které fungují na více číslech najednou.

Takže v zásadě je cesta k jděte, pokud nemáte hardwarová omezení nebo pokud analýza neukázala, že ukládání čísel s dvojitou přesností významně přispívá k využití paměti.

Komentáře

  • “ Moderní počítače „, což znamená procesory Intel x86. Některé ze strojů, které Antici používali, poskytovaly naprosto přiměřenou přesnost základního typu plováku. (CDC 6600 používal 60bitové slovo, 48 bitů normalizované mantisy s plovoucí desetinnou čárkou, 12 bitů exponentu. To ‚ TÉMĚŘ to, co vám x86 dává pro dvojnásobnou přesnost.)
  • @ John.R.Strohm: souhlasil, ale kompilátoři C na CDC6600 neexistovali. Byl to Fortran IV …
  • Autorem “ moderních počítačů “ Myslím jakýkoli procesor postavený v posledním desetiletí nebo dva, nebo opravdu, protože standard IEEE s plovoucí desetinnou čárkou byl široce implementován. Jsem si ‚ dokonale vědom, že existují architektury jiné než x86, a měl jsem to na paměti s mojí odpovědí – zmínil jsem GPU a vestavěné procesory, které obvykle nejsou x86.
  • To však ‚ prostě není pravda. SSE2 může manipulovat 4 plováky nebo 2 zdvojnásobí v jedné operaci, AVX může manipulovat s 8 plováky nebo 4 zdvojnásobí, AVX-512 může manipulovat s 16 plováky nebo 8 zdvojnásobí. Pro jakýkoli druh vysoce výkonných počítačů by měla být matematika na plovácích považována za dvojnásobnou rychlost stejných operací na čtyřhře na x86.
  • A to ‚ s ještě horší než to, protože do mezipaměti procesoru se vejde dvakrát tolik plováků, než u dvoulůžkových, a latence paměti bude pravděpodobně hlavním problémem mnoha programů. Udržování teploty celé pracovní sady plováků v mezipaměti může být doslova o řád rychlejší než použití zdvojnásobení a přelití do RAM.

Odpovědět

Použijte double pro všechny výpočty a dočasné proměnné. Použijte float, když potřebujete udržovat řadu čísel – float[] (pokud je přesnost dostatečná) a máte co do činění s desítkami tisíce float čísel.

Mnoho / většina matematických funkcí nebo operátorů převádí / vrací double a vy ne “ Nechci vracet čísla zpět na float pro jakékoli mezikroky.

Např. Pokud máte vstup 100 000 čísel ze souboru nebo streamu a potřebujete roztřídit je, dát čísla do float[].

Odpovědět

Některé platformy (ARM Cortex-M2, Cortex-M4 atd.) Nepodporuje double (Vždy to lze zkontrolovat v referenční příručce do vašeho procesoru. Pokud zde nejsou žádná varování nebo chyby kompilace, neznamená to, že je kód optimální. double lze emulovat .). Proto se možná budete muset držet int nebo float .

Pokud tomu tak není, použil bych double .

Můžete si prohlédnout slavný článek D. Goldberga („Co by měl každý počítačový vědec vědět o aritmetice s plovoucí desetinnou čárkou“). Než použijete aritmetiku s plovoucí desetinnou čárkou, měli byste si to dvakrát rozmyslet. Existuje docela velká šance, že ve vaší konkrétní situaci nejsou vůbec potřeba.

http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf

Komentáře

  • Tato otázka byla již docela dobře zodpovězena před rokem …ale v každém případě ‚ d řeknu kdykoli ‚ znovu použijete double na platformách s dvojitou přesností FPU zrychlení, měli byste na jakémkoli jiném, i když to znamená nechat kompilátor emulovat jej místo toho, aby využíval výhody FPU pouze s plovoucí desetinnou čárkou (všimněte si, že FPU ‚ s aren není vyžadováno na všech platformách, architektura Cortex-M4 je definuje jako volitelnou funkci [byl M2 překlep?]).
  • Klíčem k této logice je, zatímco it ‚ s true one by měl být unavený aritmetikou s plovoucí desetinnou čárkou a ‚ s mnoha “ quirks „, rozhodně nebrat přítomnost podpory FPU pro čtyřhru znamená jednoduše použít dvojku místo plováků. Plováky jsou obecně rychlejší než zdvojnásobení a zabírají méně paměti (funkce FPU se liší). Objem použití vylučuje předčasnou optimalizaci tohoto bodu. Stejně jako fakt je zdvojnásobení zjevně přehnané pro mnoho (možná i většinu) aplikací. Musí prvky na této stránce skutečně počítat jejich relativní polohy a velikosti na 13 desetinná místa?
  • Pokud vkládáte odkaz na stránku nebo dokument mimo web, zkopírujte prosím relevantní informace nebo shrnutí z dokumentu do vaší odpovědi. Odkazy mimo web mají tendenci časem mizet.

Odpovědět

U problémů v reálném světě je limit vzorkování při zodpovězení této otázky jsou vaše data důležitá. Podobně je důležitá také hluková podlaha. Pokud je některý z nich překročen výběrem datového typu, nepřinese žádnou výhodu zvýšení přesnosti.

Většina vzorkovačů v reálném světě je omezena na 24bitové převodníky DAC. Navrhujeme, aby 32 bitů přesnosti ve výpočtech v reálném světě mělo být dostačujících, pokud je jejich význam 24 bitů přesnosti.

Dvojitá přesnost je za cenu dvojnásobné paměti. Omezení používání zdvojnásobení nad floaty by proto mohlo drasticky snížit paměťovou stopu / šířku pásma spuštěných aplikací.

Odpovědět

Volba jakou proměnnou použít mezi float a double závisí na přesnosti požadovaných dat. Pokud je třeba, aby odpověď měla zanedbatelný rozdíl od skutečné odpovědi, bude počet požadovaných desetinných míst mnoho, což bude určovat použití tohoto dvojnásobku. Float odřízne část desetinných míst, čímž sníží přesnost.

Komentáře

  • Tato odpověď nepřidává ‚ k otázce nic nového a neříká nic o skutečném použití.

Odpověď

Obvykle používám typ float Nepotřebuji větší přesnost – například kvůli penězům – což je špatné, ale je to to, co dělám špatně.

Na druhou stranu používám double když potřebuji větší přesnost, například pro složité matematické algoritmy.

Standard C99 říká toto:

Existují tři typy s plovoucí desetinnou čárkou: float, double a long double. Typ double poskytuje alespoň stejnou přesnost jako float a typ long double poskytuje alespoň stejnou přesnost jako double. Sada hodnot typu float je podmnožinou sady hodnot typu double; sada hodnot typu double je podmnožinou sady hodnot typu long double.

Nikdy jsem opravdu nepoužil long double, ale C / C ++ tolik nepoužívám. Obvykle používám dynamicky psané jazyky jako Python, kde se o typy nemusím starat.

Další informace o Double vs Float najdete v této otázce v SO .

Komentáře

  • Použití plovoucí desetinné čárky pro výpočty vážných peněz je pravděpodobně chyba.
  • float je přesně nesprávný typ pro peníze. Musíte používat nejvyšší možnou přesnost.
  • @BartvanIngenSchenau Plovoucí bod za peníze je obvykle v pořádku, binární plovoucí bod není. Například .net ‚ s Decimal je typ s plovoucí desetinnou čárkou a ‚ obvykle dobrá volba pro výpočet peněz.
  • @ChrisF Nepotřebujete ‚ “ vysokou přesnost “ pro peníze potřebujete přesné hodnoty.
  • @SeanMcSomething – spravedlivý bod. Plováky jsou však stále nesprávným typem a vzhledem k typům s plovoucí desetinnou čárkou, které jsou k dispozici ve většině jazyků, potřebujete “ vysokou přesnost „, abyste získali “ přesné hodnoty „.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *