Ero kelluvan ja kaksinkertaisen välillä - kumpaa minun pitäisi käyttää?

(Huomaa: Tässä artikkelissa oletetaan, että lukijat tietävät tietotekniikan perusteet)

Monet aloittelijoille ohjelmoijille / opiskelijoille, jotka ovat opiskelleet tietojenkäsittelytiedettä, kysyvät usein kysyttyjä kysymyksiä, jotka ovat merkityksellisiä tietotekniikan alalle, jota he opiskelevat. Useimmat aloittelijakurssit alkavat numerojärjestelmän aiheista, joita käytetään nykyaikaisissa tietokoneissa, mukaan lukien binääri, desimaalin, oktaali ja heksadesimaali järjestelmään. Nämä ovat tietokoneiden numeromuodot, jotka edustavat tietokoneiden (tai laskimien ja muun tyyppisten digitaalisten tietokoneiden) numeerisia arvoja. Nämä arvot tallennetaan nimellä "bittien ryhmittely".

Kuten tiedämme, tietokoneet edustavat tietoja binaarinumeroina (ts. Yhdistelmänä) 1s ja 0s, kuten, 1111 edustaa 15 desimaalijärjestelmässä), on järkevää opettaa erilaisia ​​lukuformaatteja, joita käytetään edustamaan dynaamista arvoaluetta, koska ne muodostavat laskennan / numeron käsittelyn peruslohkot kaikenlaisessa toiminnassa. Kun numerojärjestelmä on määritelty luokkahuoneessa (usein huonosti), oppilailla on houkutus siirtyä eri tyyppisiin numeromuotoihin saman tyypin sisällä (ts.., liukulukuaritmeettinen), joilla on tietty tarkkuus ja numeroalue. Siksi heidät pakotetaan oppimaan tiettyjen tyyppien väliset vivahteet. Kaksi yleisimmin käytettyjä tietotyyppejä ovat Kellua ja Kaksinkertainen, ja vaikka ne kohdistuvat samoihin tarpeisiin (ts., liukulukuaritmeettinen), niiden sisäisessä esityksessä ja kokonaisvaikutuksessa ohjelman laskelmiin on melko vähän eroja. On valitettavaa, että monet ohjelmoijat kaipaavat Flat- ja Double-tietotyyppien välisiä vivahteita, ja lopulta väärinkäyttävät niitä paikoissa, joissa niitä ei pitäisi ensisijaisesti käyttää. Viime kädessä väärät laskelmat ohjelman muissa osissa.

Tässä artikkelissa aion kertoa teille erotuksen kelluvan ja kaksinkertaisen välillä C-ohjelmointikielen koodiesimerkkien kanssa. Aloitetaan!

Kelluva vs. kaksinkertainen ... Mikä sopii?

Kelluva ja Tupla ovat dataesitystä, jota käytetään liukulukujen aritmeettisiin operaatioihin. Ajattele desimaalilukuja, jotka lasket matematiikan luokassa, kuten, 20,123, 16.23, 10,2, jne., ne eivät ole kokonaislukuja (ts., 2, 5, 15, jne.), joten ne edellyttävät murto-osien huomioon ottamista binaarissa. Saatuina desimaalilukuna (ts., 20,123, 16.23, jne.) ei voida helposti esittää normaalilla binaarimuodolla (ts. kokonaisluku). Tärkein ero kelluvan ja kaksinkertaisen välillä on, että ensimmäinen on yhden tarkkuuden (32-bittinen) liukulukudata, kun taas jälkimmäinen on kaksinkertaisen tarkkuuden (64-bittinen) liukuluku. Tuplaa kutsutaan kaksinkertaiseksi, koska se on pohjimmiltaan kaksinkertainen tarkkuusversio Floatista. Jos lasket valtavan määrän (ajattele tuhansien 0: n lukumäärää), niin epätarkkuudet ovat pienempiä Tuplassa ja et menetä paljon tarkkuutta.

On parempi kehittää käyttämällä koodiesimerkkejä. Seuraava on toiminta kelluu ja kaksinkertaistaa matemaattisten toimintojen avulla, jotka toimitetaan C-kielellä:

#sisältää

int main ()

kellu num1 = 1,f / 82;

kelluva num2 = 0;

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

num2 + = num1;

printf (“%. 7g \ n”, num2);

kaksinkertainen num3 = 1,0 / 82;

kaksinkertainen num4 = 0;

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

num4 + = num3;

printf (“%. 15g \ n”, numero4);

getchar ();

Se tulostaa seuraavan:

9.000031

+8,99999999999983

Täällä voit nähdä, että pieni ero Float- ja Double-tarkkuuksissa antaa erilaisen vastauksen, vaikka Double näyttää olevan tarkempi kuin Float.

Seuraava on esimerkki sqrt () -toiminnosta C: ssä:

#sisältää

#sisältää

int main ()

kellu num1 = sqrt (2382719676512365.1230112312312312);

kaksinkertainen num2 = sqrt (2382719676512365.1230112312312312);

printf (“% f \ n”, numero1);

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

getchar ();

Se antaa seuraavan tuloksen:

48813108.000000

48813109.678778

Täällä voit nähdä, että Double-vastaus on tarkempi.

Kaiken kaikkiaan on parempi käyttää Tuplaa liukulukujen aritmeettiseen käyttöön, koska useat C: n vakio matematiikkatoiminnot toimivat Tupla-tietokoneilla ja nykyaikaiset tietokoneet ovat erittäin nopeita ja tehokkaita kaksinkertaisen liukulukujen laskentaan. Tämä vähentää Float-käytön tarvetta, paitsi jos sinun on käytettävä paljon liukulukujen numeroita (ajattele suuria ryhmiä, joissa numeroissa on tuhansia 0: ta) tai käytät järjestelmää, joka ei tue kaksinkertaista- tarkka liukuluku, koska monet GPU: t, vähätehoiset laitteet ja tietyt alustat (ARM Cortex-M2, Cortex-M4 jne.) eivät vielä tue Tuplaa, sinun on käytettävä Floatia. Lisäksi on muistettava, että tietyt GPU / CPU: t toimivat paremmin / tehokkaammin Float-prosessoinnissa, kuten vektoreiden / matriisin laskennassa, joten sinun on ehkä tutkittava laitteisto-eritelmän käsikirjaa / dokumentaatiota päättääksesi paremmin, kumpaa sinun tulisi käyttää tietylle koneelle.

Moderneille tietokoneille suunnatussa koodissa on harvoin syytä käyttää Float-tyyppiä Tuplan sijaan. Double-tarkkuuden ylimääräinen tarkkuus vähentää pyöristysvirheiden tai muun epätarkkuuden mahdollisuutta, joka voi aiheuttaa ongelmia muissa ohjelman osissa, mutta ei poista sitä. Monet matemaattiset toiminnot tai operaattorit muuntavat ja palauttavat kaksinkertaisen, joten sinun ei tarvitse heittää numeroita takaisin kelluvaan, koska se saattaa menettää tarkkuuden. Yksityiskohtaista analyysiä liukulukujen aritmeettisesta käytöstä suosittelen lukemaan tämä mahtava artikkeli (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Yhteenveto

Joten… pähkinänkuoressa:

Paikat, joissa sinun tulisi käyttää Float:

  • Jos kohdistat laitteisiin, joissa yhden tarkkuuden tarkkuus on nopeampi kuin kaksinkertaisen tarkkuuden.
  • Sovelluksessasi käytetään paljon liukulukujen aritmeettista tekniikkaa, kuten tuhansia numeroita, joissa on tuhansia nollia.
  • Olet tekemässä erittäin matalan tason optimointia. Käytät esimerkiksi erityisiä CPU-ohjeita (ts. SSE, SSE2, AVX jne.), Jotka toimivat useilla numeroilla / matriiseilla / vektoreilla kerrallaan.

johtopäätös

Tässä artikkelissa olen korostanut eroa kelluvan ja kaksinkertaisen välillä ja kumpaa tulisi käyttää tietyissä paikoissa. Tietysti on parempi käyttää Tuplaa useimmissa paikoissa sokeasti, varsinkin jos kohdistat nykyaikaisiin tietokoneisiin, koska kaksinkertaisen liukulukuaritmetiikan käytöstä johtuvat pientehokkuusmahdollisuudet ovat erittäin epätodennäköisiä. Jos sinulla on kysyttävää, voit kysyä alla olevasta kommenttiosasta!