Különbség az úszó és a kettős között - melyiket használnám? A különbség a

Anonim

(Megjegyzés: feltételezi, hogy az olvasók tudnak a számítástechnika alapjairól.)

Sok újgazdag programozó / diák, aki beiratkozott a számítógépes tudományra, kérdezze meg a számítógépes tudományban lévő adott területen releváns, gyakran feltett kérdéseket. A legelterjedtebb kurzusok a modern számítógépek számrendszerének témáin kezdődnek, beleértve a bináris , decimális , octal és hexadecimális < rendszer. Ezek azok a számítógépes számformátumok, amelyek a számítógépek (vagy számológépek és bármilyen más digitális számítógépek) számértékének belső reprezentációi. Ezeket az értékeket "bitek csoportosítása" formájában tárolják. Mint ismeretes, a számítógépek bináris számjegyekből álló adatok (például

1s

és 0s , például 1111 15 a decimális rendszerben), értelme tanítani a különbözõ számformátumokat, amelyeket az értékek dinamikus tartományának képviselnek, mivel ezek alkotják a számítás / szám feldolgozás alapblokkjait bármilyen műveletben. Miután a számrendszert az osztályteremben definiálták (gyakran rosszul), a diákok hajlamosak arra, hogy ugyanazon típusú (azaz, lebegőpontos aritmetika ) különböző számformátumokra ugorjanak, amelyek bizonyos pontossággal és számtartományokkal rendelkeznek. Így arra kényszerülnek, hogy megtanulják az árnyalatokat bizonyos típusok között. A leggyakrabban használt adattípusok közül kettő Float és Dupla , ugyanazon igények (pl. lebegőpontos aritmetika ) némi különbség a belső reprezentációban és a program számításának általános hatása. Sajnálatos, hogy sok programozó kihagyja a sík és kettős adattípusok közötti árnyalatokat, és végül azokat helytelenül használja olyan helyeken, ahol nem szabad használni őket. Végső soron a program más részein végzett hibás számításokat eredményez.

Ebben a cikkben elmondom a különbséget az úszó és a dupla között a kód példák C programozási nyelv. Lássunk neki!

Float vs Double … Mi az üzlet?

A Float és a Double a lebegőpontos aritmetikai műveletekhez használt adatmegjelenítés, gondoljon a matematikai osztályban kiszámított tizedes számokra, például

20-ra. 123

, 16. 23 , 10. 2 stb.), Nem egész számok (pl. 2 , 5 , 15 stb.) frakciók a binárisban. A kapott decimális számok (például: 20. 123 , 16. 23 stb.) nem lehet egyszerűen ábrázolni egy normál bináris formátumban (azaz, egészben). A legfontosabb különbség Float és Double között az, hogy az előbbi az egyetlen precíziós (32 bites) lebegőpontos adat, míg az utóbbi kettős pontosságú (64 bites) lebegőpontos adattípus. Dupla "dupla", mert alapvetően egy dupla precíziós változata a Float. Ha hatalmas összeget számolsz (gondolod a 0-asok ezreinek számára), akkor a duplikációban a pontatlanságok kisebbek lesznek, és nem fogod elveszíteni nagy pontosságot.

Javítani kell a kód példák használatával. A következő művelet a Float és a Double segítségével a C nyelvben biztosított matematikai függvényeken:

#include

int main () {

float num1 = 1. f / 82;

float num2 = 0;

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

num2 + = num1;

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

dupla num3 = 1. 0/82;

dupla num4 = 0;

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

num4 + = num3;

printf ("%.15g n", szám4);

getchar ();

}

Kinyomtatja a következőket:

9. 000031

8. 99999999999983

Itt láthatja, hogy a Float és a Double pontosságában mutatkozó kis eltérés teljesen eltérő választ ad, bár kettősnek tűnik pontosabbnak, mint a Float.

A következő: sqrt () függvény példája C:

#include

#include

int main () {

float num1 = sqrt (2382719676512365) 1230112312312312);

dupla num2 = sqrt (2382719676512365, 1230112312312312);

printf ("% f n", num1);

printf ("% f n", szám2);

getchar ();

}

A következő kimenetet adja:

48813108. 000000

48813109. 678778

Itt láthatja, hogy a kettős válasz pontosabb.

Mindent összevetve, jobb használni a Double-t a lebegőpontos aritmetikához, mivel a C-ban több standard matematikai funkció működik a Double és a modern számítógépeken, rendkívül gyors és hatékony a kettős lebegőpontos számításokhoz. Ezzel csökkenthető az úszás szükségessége, hacsak sok lebegőpontos számmal nem kell működni (gondoljon olyan nagy tömbökre, amelyeknél a számok ezrei 0-asak ezrei vannak), vagy olyan rendszeren működik, amely nem támogatja a kettős- precíziós lebegőpont, annyi GPU, kis teljesítményű eszköz és bizonyos platformok (ARM Cortex-M2, Cortex-M4 stb.) nem támogatják még a Double-et, akkor használjon Float-ot. Ezenkívül emlékeznünk kell arra, hogy egyes GPU-k / CPU-k jobban hatékonyan működnek a Float feldolgozásban, mint például a vektorok / mátrix kiszámításánál, ezért meg kell keresned a hardver specifikáció kézikönyvét / dokumentációját, hogy jobban eldönthessük, melyiket kell használni egy adott géphez.

Ritkán van oka arra, hogy a Modern számítógéppel célzott kódban a Floot helyett Double-et használj. A kettős dupla pontosság csökkenti, de nem szünteti meg, a kerekítési hibák vagy más pontatlanság esélye, amely problémákat okozhat a program más részein. Számos matematikai függvény vagy operátor átalakítja és visszaadja a Double-et, így nem kell visszahozni a számokat Floatra, mivel ez elveszítheti a pontosságot.A lebegőpontos aritmetika részletes elemzéséhez nagyon ajánlom, hogy olvassa el ezt a félelmetes cikket (// docs. Oracle. Com / cd / E19957-01 / 806-3568 / ncg_goldberg. Html).

Összefoglaló

Tehát … dióhéjban:

Azon helyek, ahol Float-t kell használni:

Ha olyan hardvereket céloz, ahol az egyszeres pontosság gyorsabb, mint a dupla pontosság.

Az alkalmazás nagymértékben kihasználja a lebegőpontos aritmetikát, például a több ezer számot, ezernyi 0-at.

Nagyon alacsony szintű optimalizálást végez. Például speciális CPU utasításokat használ (pl. SSE, SSE2, AVX stb.), Amelyek egyszerre több számot / tömböt / vektort működtetnek.

  • Következtetés
  • Ebben a cikkben kiemeltem a Float és a Double közötti különbséget, és melyiket kell használni bizonyos helyeken. Nyilvánvaló, hogy a Double-et a legtöbb helyen vakon kell használni, különösen akkor, ha modern számítógépekre célzol, mivel a kettős lebegőpontos aritmetika használatából adódó alacsony hatékonyság esélye nagyon valószínűtlen. Ha bármilyen kérdése van, akkor kérdezze meg az alábbi megjegyzést!