(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!
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).
Tehát… dióhéjban:
Helyek, ahol használni kell az úszót:
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!