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

(Megjegyzés: Ez a cikk feltételezi, hogy az olvasók tudják a számítástechnika alapjait.)

Számos újonnan programozó / hallgató, aki beiratkozott a számítógépes tudományba, felteszi a gyakran feltett kérdéseket, amelyek relevánsak az általuk tanulott számítógépes tudomány területén. A legtöbb kezdő tanfolyam a modern számítógépekben használt számrendszer témáival kezdődik, ideértve a kétkomponensű, decimális, nyolcas és hexadecimális rendszer. Ezek a számítógépes számformátumok, amelyek a számértékek belső reprezentációját jelentik a számítógépekben (vagy számológépekben és bármilyen más digitális számítógépben). Ezeket az értékeket „bitek csoportosítása ”ként tároljuk.

Mint tudjuk, a számítógépek az adatokat bináris számjegyekből állnak (azaz a 1s és 0s, úgymint, 1111 képviseli 15 tizedesrendszerben), értelme van a dinamikus értékek tartományának ábrázolására szolgáló különféle számformátumokról, mivel ezek a számítás / számfeldolgozás alapvető blokkjai bármilyen műveletnél. Miután a számrendszert meghatározták az osztályban (gyakran rosszul), a diákoknak kísértésnek kell lenniük, hogy ugyanazon típuson belül különböző számformátumokra lépjenek (azaz., lebegőpontos számtani), amelyeknek van bizonyos pontossága és számtartománya. Így kénytelenek megtanulni az egyes típusok közötti árnyalatokat. Két a leggyakrabban használt adattípus Úszó és Kettős, és bár ugyanazokat a szükségleteket célozzák meg (azaz., lebegőpontos számtani), némi különbség van a belső ábrázolásukban és a programban alkalmazott számításokra gyakorolt ​​általános hatásokban. Sajnálatos, hogy sok programozó kihagyja a Flat és Double adattípusok közötti árnyalatokat, és végül helytelenül használja őket azokon a helyeken, ahol ezeket elsősorban nem szabad használni. Végül téves számításokat eredményez a program más részeiben.

Ebben a cikkben el fogom mondani a különbséget az úszó és a kettős között a C-nyelvű kódpéldákkal. Lássunk neki!

Úszó vs dupla ... Mi az üzlet??

A lebegőpontos és a dupla adat az ábrázolás, amelyet a lebegőpontos aritmetikai műveletekhez használnak. Gondoljunk a matematika osztályban kiszámított tizedes számokra, például:, 20,123, 16.23, 10.2, stb., nem egész számok (azaz., 2, 5, 15, stb.), tehát a bináris frakciók figyelembevételét igénylik. Az eredményül kapott decimális számok (azaz., 20,123, 16.23, stb.) nem reprezentálható könnyen egy normál bináris formátummal (azaz egész számmal). A fő különbség a lebegő és a kettős között az, hogy az előbbi az egyetlen pontosságú (32 bites) lebegőpontos adatok, míg az utóbbi kettős pontosságú (64 bites) lebegőpontos adatok. A dupla „dupla”, mert alapvetően kettős pontosságú változata a Float-nak. Ha hatalmas összeget számol (gondoljon az ezrek 0-ra a számban), akkor a pontatlanságok a duplában kisebbek lesznek, és nem veszít sok pontosságot.

Sokkal jobb kidolgozni a kódpéldákat. Az alábbiakban az úszó és a dupla művelet történik a C nyelvű matematikai funkciók révén:

#include

int main ()

float num1 = 1,f / 82;

float num2 = 0;

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

num2 + = num1;

printf (“%. 7g \ n”, 2. szám);

kettős szám3 = 1,0 / 82;

kettős szám4 = 0;

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

num4 + = num3;

printf (“%. 15g \ n”, 4. szám);

getchar ();

Az alábbiakat nyomtatja ki:

9.000031

8,99999999999983

Itt látható, hogy a float és a dupla pontosság kismértékű különbsége összesen eltérő választ ad, bár a Double úgy tűnik pontosabb, mint a float.

Az alábbiakban bemutatjuk az sqrt () függvényt C-ben:

#include

#include

int main ()

úszó szám1 = sqrt (2382719676512365.1230112312312312);

kettős szám = sqrt (2382719676512365.1230112312312312);

printf („% f \ n”, 1. szám);

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

getchar ();

A következő kimenetet adja:

48813108.000000

48813109.678778

Itt látható, hogy a Dupla válasz jobb pontossággal rendelkezik.

Összességében jobb, ha a Dupla lebegőpontos aritmetikát használ, mivel a C több standard matematikai funkciója dupla módon működik, a modern számítógépek pedig rendkívül gyorsak és hatékonyak a kettős lebegőpontos számításoknál. Ez csökkenti a Float használatának szükségességét, kivéve, ha sok lebegőpontos számmal kell működnie (gondoljon olyan nagy tömbökre, amelyekben a számok ezrei vannak), vagy olyan rendszeren működik, amely nem támogatja a kettős- precíziós lebegőpontos pont, mivel sok GPU, alacsony fogyasztású eszköz és bizonyos platformok (ARM Cortex-M2, Cortex-M4 stb.) még nem támogatják a Double-t, akkor használjon Float-ot. Ezen túlmenően, egy dolog, amit figyelembe kell venni, hogy bizonyos GPU-k / CPU-k jobban / hatékonyan működnek az úszó feldolgozása során, mint például a vektorok / mátrix kiszámításakor, ezért előfordulhat, hogy át kell néznie a hardver specifikációs kézikönyvet / dokumentációt, hogy jobban eldöntse, melyiket kell használni. egy adott géphez.

A modern számítógépeket célzó kódban ritkán indokolt a float használata a Double helyett. A dupla extra pontosság csökkenti, de nem zárja ki a kerekítési hibák vagy egyéb pontatlanságok esélyét, amelyek problémákat okozhatnak a program más részein. Számos matematikai függvény vagy operátor konvertálja és visszatér duplán, tehát nem kell visszaadnia a számokat a Float-hoz, mivel ez elveszítheti a pontosságot. A lebegőpontos aritmetika részletes elemzéséhez nagyon ajánlom, hogy olvassa el ezt a fantasztikus cikket (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

összefoglalás

Tehát… dióhéjban:

Helyek, ahol használni kell az úszót:

  • Ha olyan hardvert céloz meg, ahol az egypontos pontosság gyorsabb, mint a kettős pontosság.
  • Az alkalmazás nagymértékben használja a lebegőpontos aritmetikát, például számok ezreit, több ezer nullával.
  • Ön nagyon alacsony szintű optimalizálást végez. Például speciális CPU utasításokat (azaz SSE, SSE2, AVX stb.) Használ, amelyek egyszerre több számon / tömbön / vektoron működnek.

Következtetés

Ebben a cikkben kiemelem a különbséget a lebegő és a kettős között, és azt, melyiket kell használni bizonyos helyeken. Vitathatatlanul jobb, ha a Dupla-t legtöbb helyen vakon használja, különösen akkor, ha modern számítógépeket céloz meg, mivel a kettős lebegőpontos számtani alkalmazás miatt alacsony hatékonyság esélye nagyon valószínűtlen. Ha bármilyen kérdése van, felteheti az alábbi megjegyzés szakaszban!