Float And Double - Alin ang Dapat Kong Gamitin?

Anonim

(Tandaan: Ipinapalagay ng artikulong ito na alam ng mga mambabasa ang tungkol sa mga pangunahing kaalaman sa Computer Science)

Maraming mga programmer / mag-aaral sa Newbie na nakatala sa Computer Science ang nagtanong sa mga madalas itanong na may kaugnayan sa partikular na larangan sa loob ng Computer Science na kanilang pinag-aaralan. Karamihan sa mga nagsisimula na kurso ay nagsisimula sa mga paksa ng sistema ng numero na ginagamit sa mga makabagong computer, kabilang ang binary , decimal , oktal at hexadecimal sistema. Ito ang mga format ng computer na numero na ang mga panloob na representasyon ng mga numerong halaga sa mga computer (o calculators at anumang iba pang uri ng mga digital na computer). Ang mga halagang ito ay naka-imbak bilang "pagpapangkat ng mga piraso".

Tulad ng alam namin ang mga computer ay kumakatawan sa data sa mga hanay ng mga binary digit (ibig sabihin, sa kumbinasyon ng 1s at 0s, tulad ng, 1111 kumakatawan 15 sa sistema ng decimal), makatwiran na magturo tungkol sa iba't ibang mga format ng numero na ginagamit upang kumatawan sa isang dynamic na hanay ng mga halaga, dahil binubuo nila ang mga pangunahing bloke ng pagproseso ng pagkalkula / numero sa anumang uri ng operasyon. Kapag ang sistema ng numero ay tinukoy sa silid-aralan (kadalasang hindi maganda), natutukso ang mga mag-aaral na lumipat sa iba't ibang mga format ng numero sa loob ng parehong uri (ibig sabihin, lumulutang-point na aritmetika ) na mayroong tiyak na hanay ng katumpakan at bilang. Kaya, sila ay napipilitang matutunan ang mga nuances sa pagitan ng ilang mga uri. Dalawang ng mga karaniwang ginagamit na uri ng data ay Lumutang at Double , at habang ini-target nila ang parehong mga pangangailangan (ibig sabihin, lumulutang-point na aritmetika ), may ilang pagkakaiba sa kanilang panloob na representasyon at pangkalahatang epekto sa pagkalkula sa programa. Ito ay kapus-palad na maraming mga programmer ang nakaligtaan ang mga nuances sa pagitan ng Flat at Double na mga uri ng data, at nagtatapos maling paggamit sa mga ito sa mga lugar kung saan hindi sila dapat gamitin sa unang lugar. Sa huli na nagreresulta sa mga miscalculations sa iba pang mga bahagi ng programa.

Sa artikulong ito, sasabihin ko sa iyo ang pagkakaiba sa pagitan ng float at double sa mga halimbawa ng code sa wika ng C programming. Magsimula na tayo!

Float vs Double … Ano ang deal?

Ang Float and Double ay representasyon ng data na ginagamit para sa mga pagpapatakbo ng floating-point aritmetika, isipin ang mga decimal na numero na iyong kalkulahin sa klase ng matematika, tulad ng, 20.123, 16.23, 10.2, atbp., hindi sila mga buong numero (ibig sabihin, 2, 5, 15, atbp.), kaya nangangailangan sila ng pagsasaalang-alang ng mga fraction sa binary. Bilang nagreresulta na mga decimal na numero (ibig sabihin, 20.123, 16.23, atbp.) ay hindi madaling maipakita sa isang normal na binary na format (ibig sabihin, Integer). Ang pangunahing pagkakaiba sa pagitan ng Float and Double ay ang dating ay ang solong katumpakan (32-bit) floating point data, habang ang huli ay double precision (64-bit) floating point data type. Ang double ay tinatawag na "double" dahil ito ay karaniwang isang double katumpakan bersyon ng Float. Kung ikaw ay nagkakalkula ng isang malaking halaga (isipin ang libu-libo ng 0 sa numero), pagkatapos ay ang mga kamalian ay magiging mas maliit sa Double at hindi ka mawawalan ng katumpakan.

Mas mainam na dagdagan ang paggamit ng mga halimbawa ng code. Ang sumusunod ay ang operasyon sa Float and Double sa pamamagitan ng mga function ng math na ibinigay sa wika ng C:

# isama

int main () {

float num1 = 1.f / 82;

float num2 = 0;

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

num2 + = num1;

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

double num3 = 1.0 / 82;

double num4 = 0;

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

num4 + = num3;

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

getchar ();

}

Ini-print ang mga sumusunod:

9.000031

8.99999999999983

Dito, makikita mo na ang bahagyang pagkakaiba sa katumpakan ng Float and Double ay nagbibigay ng iba't ibang sagot sa kabuuan, bagaman ang Double ay tila mas tumpak kaysa Float.

Ang sumusunod ay ang halimbawa ng sqrt () function sa C:

# isama

# isama

int main () {

float num1 = sqrt (2382719676512365.1230112312312312);

double num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

getchar ();

}

Nagbibigay ito ng sumusunod na output:

48813108.000000

48813109.678778

Dito, makikita mo na ang sagot sa Double ay may mas mahusay na katumpakan.

Higit sa lahat, mas mahusay na gamitin ang Double para sa floating-point arithmetic, dahil ang ilang mga standard na function sa matematika sa C ay nagpapatakbo sa Double at modernong mga computer ay napakabilis at mahusay para sa Double floating-point na mga kalkulasyon. Ito ay humantong sa pagbawas ng pangangailangan na gumamit ng Float, maliban kung kailangan mong gumana sa maraming mga lumulutang-point na numero (sa tingin ng mga malalaking arrays na may libu-libong 0 sa mga numero) o ikaw ay nagpapatakbo sa isang sistema na hindi sumusuporta sa double- katumpakan lumulutang point, tulad ng maraming mga GPUs, mga aparatong mababa at ilang mga platform (ARM Cortex-M2, Cortex-M4, atbp.) ay hindi sumusuporta sa Double pa, pagkatapos ay dapat mong gamitin ang Float. Bukod dito, isang bagay na dapat tandaan ay ang ilang GPUs / CPUs na gumagana nang mas mahusay / mahusay sa pagproseso ng Float, tulad ng pagkalkula ng mga vectors / matrix, kaya maaaring kailangan mong tumingin sa manu-manong pagtutukoy ng hardware / dokumentasyon upang mas mahusay na magpasya kung alin ang dapat mong gamitin para sa isang partikular na makina.

May bihirang dahilan upang gumamit ng Float sa halip na Double sa code na nagta-target ng mga modernong computer.Ang sobrang katumpakan sa Double ay binabawasan, ngunit hindi inaalis, ang posibilidad ng mga pagkakamali ng pag-ikot o iba pang kawalan na maaaring maging sanhi ng mga problema sa ibang mga bahagi ng programa. Maraming mga pag-andar ng math o operator ang nag-convert at nagbalik ng Double, kaya hindi mo kailangang palayasin ang mga numero pabalik sa Float, dahil maaaring mawala ang katumpakan. Para sa isang detalyadong pag-aaral sa Floating-point arithmetic, inirerekumenda ko sa iyo na basahin ang kahanga-hangang artikulong ito (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Buod

Kaya … sa maikling sabi:

Mga lugar kung saan dapat mong gamitin ang Float:

  • Kung tina-target mo ang hardware kung saan ang single-precision ay mas mabilis kaysa sa double-precision.
  • Ginagawa ng iyong application ang mabigat na paggamit ng floating-point aritmetika, tulad ng libu-libong mga numero na may libu-libong 0.
  • Ginagawa mo ang napakababang antas ng pag-optimize. Halimbawa, gumagamit ka ng mga espesyal na tagubilin sa CPU (ibig sabihin, SSE, SSE2, AVX, atbp.) Na nagpapatakbo sa maraming mga numero / arrays / vectors sa isang pagkakataon.

Konklusyon

Sa artikulong ito ay nai-highlight ko ang pagkakaiba sa pagitan ng Float and Double, at kung alin ang dapat gamitin sa mga tiyak na lugar. Masasabi, mas mahusay na gamitin ang Double sa maraming lugar nang walang taros, lalo na kung tina-target mo ang mga modernong computer, dahil ang posibilidad ng mababang-kahusayan dahil sa paggamit ng Double floating-point aritmetika ay malamang na hindi posible. Kung mayroon kang anumang mga katanungan, maaari kang magtanong sa seksyon ng komento sa ibaba!