Float And Double - Kumpi pitäisi käyttää?

Anonim

(Huomaa: Tässä artikkelissa oletetaan, että lukijat tietävät tietojenkäsittelytieteen peruskannoista)

Monet aloittelija ohjelmoijat / opiskelijat, jotka ovat ilmoittautuneet tietojenkäsittelytieteessä kysyvät usein kysyttyjä kysymyksiä, jotka liittyvät tietyn kentän tietojenkäsittelytieteen, että he opiskelevat. Useimmat aloittelijat alkavat numerojärjestelmän aiheista, joita käytetään nykyaikaisissa tietokoneissa, mm binääri , desimaalin , oktaali ja heksadesimaali järjestelmään. Nämä ovat tietokoneen numeromuotoja, jotka ovat tietokoneissa (tai laskimissa ja missä tahansa muussa digitaalitilassa) olevien numeeristen arvojen sisäisiä esityksiä. Nämä arvot tallennetaan "bittien ryhmittelemiseksi".

Tiedämme, että tietokoneet edustavat dataa binääriluvuissa (eli yhdistelmässä 1s ja 0s, kuten, 1111 edustaa 15 desimaalijärjestelmässä), on järkevää opettaa eri numeroformaatteja, joita käytetään dynaamisen arvoalueen esittämiseen, koska ne muodostavat laskennan / numeron käsittelyn peruslohkot millä tahansa toiminnolla. Kun lukijärjestelmä on määritelty luokkahuoneessa (usein huonosti), opiskelijat ovat houkuttelevia siirtymään eri tyyppisiin samanlaisiin numeromuotoihin (ts. liukuluku aritmeettinen ), joilla on tietty tarkkuus ja määräalue. Niinpä he joutuvat oppimaan erityyppisiä vivahteita. Kaksi yleisimmin käytetystä tietotyypistä on Kellua ja Kaksinkertainen , ja vaikka ne kohdistavat samat tarpeet (ts. liukuluku aritmeettinen ), niiden sisäinen edustus ja niiden kokonaisvaikutus suhteessa ohjelman laskentaan ovat melko jonkin verran. On valitettavaa, että monet ohjelmoijat menettävät vakiot Flat- ja Double-tietotyyppien välillä ja päätyvät väärinkäyttämällä niitä paikoissa, joissa niitä ei pitäisi käyttää ensisijaisesti. Tämä johtaa lopulta virheellisiin laskelmiin ohjelman muissa osissa.

Tässä artikkelissa aion kertoa sinulle eron float ja kaksinkertainen koodin esimerkkejä C-ohjelmointikielellä. Aloitetaan!

Float vs. Double … Mikä on kauppa?

Float ja Double ovat datan edustus, jota käytetään liukuluvuissa aritmeettisissa operaatioissa, ajattele matematiikkaluokassa laskettavia desimaaleja, kuten, 20.123, 16.23, 10.2, jne., ne eivät ole kokonaislukuja (ts. 2, 5, 15, jne.), joten ne edellyttävät binaarissa olevien fraktioiden huomioon ottamista. Tuloksena olevat desimaaliluvut (ts. 20.123, 16.23, jne.) ei voida helposti esittää tavallisella binäärimuodolla (eli kokonaislukua). Tärkein ero Floatin ja Double välillä on se, että edellinen on yhden tarkkuuden (32-bittinen) liukuluku, kun taas jälkimmäinen on kaksinkertainen tarkkuus (64-bittinen) liukuluvutyyppityyppi. Double on nimeltään "kaksinkertainen", koska se on pohjimmiltaan kaksoissuoritusversio Floatista. Jos lasket valtavan määrän (ajattele tuhansia 0: ää luvussa), epätarkkuudet ovat pienemmät Double-tilassa ja et menetä paljon tarkkuutta.

On parasta käsitellä koodin esimerkkien käyttöä. Seuraavassa on toiminto Float- ja Double-toiminnolla C-kielen matemaattisten toimintojen kautta:

#sisältää

int main () {

float num1 = 1.f / 82;

float num2 = 0;

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

num2 + = num1;

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

kaksinkertainen num3 = 1,0 / 82;

kaksinkertainen num4 = 0;

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

num4 + = num3;

printf ("%.15g n", numero4);

getchar ();

}

Se tulostaa seuraavat:

9.000031

8.99999999999983

Täältä näet, että Float- ja Double-tarkkuuserot ovat hieman erilainen, vaikka Double näyttäisi olevan tarkempi kuin Float.

Seuraavassa on esimerkki sqrt () -toiminnosta C:

#sisältää

#sisältää

int main () {

float num1 = sqrt (2382719676512365.1230112312312312);

kaksinumeroinen num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

getchar ();

}

Se antaa seuraavan tuotoksen:

48813108.000000

48813109.678778

Täältä näet Double-vastauksen tarkemman tarkkuuden.

Kaiken kaikkiaan on parempi käyttää kaksinkertaista liukulukuinen aritmeettinen, sillä useat standardin matemaattiset toiminnot C: ssä toimivat Double ja modernissa tietokoneissa ovat erittäin nopeita ja tehokkaita Double floating-point -laskelmissa. Tämä vähentää tarvetta käyttää Floataa, ellei sinun tarvitse käyttää paljon liukulukuisia numeroita (ajatella suuria ryhmiä, joissa on tuhansia 0: ää numeroina) tai käytät järjestelmää, kuten monet GPU: t, pienitehoiset laitteet ja tietyt alustat (ARM Cortex-M2, Cortex-M4 jne.) eivät tue kaksoistutkimuksia, mutta käytä Floatia. Lisäksi on syytä muistaa, että tietyt GPU: t / prosessorit toimivat tehokkaammin Float-prosessissa, kuten vektorien / matriisin laskemisessa, joten sinun on ehkä tarkasteltava laitteiston määrittelykäsikirjaa / dokumentaatiota, jotta päättäisit paremmin, mitä sinun pitäisi käyttää tietylle koneelle.

Usein on syytä käyttää Floatia Doublein sijaan nykyaikaisten tietokoneiden koodissa. Double-ylimääräinen tarkkuus vähentää mutta ei eliminoi mahdollisuutta pyöristää virheitä tai muita epätarkkuuksia, jotka voivat aiheuttaa ongelmia muissa ohjelmien osissa. Monet matemaattiset toiminnot tai operaattorit muuntavat ja palaavat Double, joten sinun ei tarvitse laskea numeroita takaisin Floatille, koska ne saattavat menettää tarkkuuden. Jos haluat yksityiskohtaisen analyysin Floating-point arithmeticistä, suosittelen sinua lukemaan tämän mahtava artikkelin (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Yhteenveto

Joten … pähkinänkuoressa:

Paikat, joissa sinun tulee käyttää Floataa:

  • Jos kohdistat laitteistoja, joissa yksitarkkuus on nopeampaa kuin kaksinkertainen tarkkuus.
  • Sovelluksessasi käytetään paljon liukulukujen aritmeettisia, kuten tuhansia numeroita tuhansittain.
  • Teet hyvin alhaisen tason optimointia. Esimerkiksi käytät erityisiä CPU-ohjeita (eli SSE, SSE2, AVX jne.), Jotka toimivat useilla numeroilla / ryhmillä / vektorilla kerrallaan.

johtopäätös

Tässä artikkelissa olen korostanut Float- ja Double -erotuksen välistä eroa ja mitkä niistä tulisi käyttää tietyissä paikoissa. On todennäköistä, että Double on useimmissa paikoissa käytössä sokeasti, varsinkin jos kohdistat nykyaikaisia ​​tietokoneita, sillä Double Floating-point-aritmeettisen käytön vähäisen tehokkuuden mahdollisuudet ovat erittäin epätodennäköisiä. Jos sinulla on kysyttävää, voit kysyä alla olevasta kommentista!