Atšķirība starp pludiņu un divkāršu - kuru man vajadzētu izmantot?

(Piezīme: Šajā rakstā tiek pieņemts, ka lasītāji zina par datorzinātnes pamatiem)

Daudzi iesācēju programmētāji / studenti, kuri studē datorzinātnēs, uzdod bieži uzdotos jautājumus, kas attiecas uz konkrēto datorzinātņu jomu, kuru viņi studē. Lielākā daļa iesācēju kursu sākas ar skaitļu sistēmas tēmām, kuras tiek izmantotas mūsdienu datoros, ieskaitot binārs, zīmes aiz komata, astoņkājis un heksadecimālais sistēma. Tie ir datoru skaitļu formāti, kas ir skaitlisko vērtību iekšējie attēlojumi datoros (vai kalkulatoros un citos digitālos datoros). Šīs vērtības tiek saglabātas kā “bitu grupēšana”.

Kā mēs zinām, datori attēlo datus bināro ciparu kopās (t.i., kombinācijā 1 s un 0s, piemēram,, 1111. lpp pārstāv 15 decimālajā sistēmā), ir jēga mācīt par dažādiem skaitļu formātiem, kurus izmanto, lai attēlotu dinamisku vērtību diapazonu, jo tie veido aprēķinu / skaitļu apstrādes pamata blokus jebkura veida operācijās. Kad klasēs ir definēta skaitļu sistēma (bieži vien slikti), studentiem rodas kārdinājums pāriet uz dažādiem skaitļu formātiem tajā pašā tipā (t.i.., peldošā komata aritmētika), kurām ir noteikta precizitāte un skaitļu diapazons. Tādējādi viņi ir spiesti iemācīties nianses starp noteiktiem veidiem. Divi no visbiežāk izmantotajiem datu veidiem ir Pludiņš un Divkāršs, un, kaut arī tie ir vērsti uz tām pašām vajadzībām (t.i.., peldošā komata aritmētika), to iekšējā attēlojumā un vispārējā ietekme uz aprēķiniem programmā ir diezgan atšķirīgas. Žēl, ka daudzi programmētāji palaida garām nianses starp Flat un Double datu tipiem un galu galā tos ļaunprātīgi izmanto vietās, kur tos vispirms nevajadzētu izmantot. Galu galā rodas nepareizi aprēķini citās programmas daļās.

Šajā rakstā es jums pastāstīšu atšķirību starp float un double ar kodu piemēriem C programmēšanas valodā. Sāksim!

Pludiņš vs dubultā… Kāds ir darījums?

Pludiņš un Divkāršs ir datu attēlojums, kas tiek izmantots ar peldošā komata aritmētiskām operācijām, domājiet par decimālskaitļiem, kurus aprēķināt matemātikas klasē, piemēram,, 20.123, 16.23, 10.2, utt., tie nav veseli skaitļi (t.i.., 2, 5, 15, utt.), tāpēc tiem ir nepieciešams ņemt vērā frakcijas binārajā. Kā iegūtie decimālie cipari (t.i.., 20.123, 16.23, utt.) nevar viegli attēlot ar parasto bināro formātu (t.i., vesels skaitlis). Galvenā atšķirība starp pludiņa un dubultā ir tāda, ka pirmais ir vienas precizitātes (32 bitu) peldošā komata dati, bet otrais ir divkāršās precizitātes (64 bitu) peldošā komata datu tips. Double tiek saukts par “double”, jo būtībā tā ir dubultā precizitātes Float versija. Ja jūs aprēķināt lielu summu (domājiet par tūkstošiem skaitļu 0), tad dubultā dubultās kļūdas būs mazākas un jūs nezaudēsit lielu precizitāti.

Labāk ir izstrādāt, izmantojot kodu piemērus. Šī ir operācija ar pludiņu un dubultā, izmantojot matemātiskās funkcijas, kas tiek nodrošinātas C valodā:

# iekļaut

int galvenā ()

pludiņš num1 = 1.f / 82;

pludiņa num2 = 0;

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

num2 + = num1;

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

dubultā num3 = 1,0 / 82;

dubultā num4 = 0;

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

num4 + = num3;

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

getčars ();

Tas izdrukā šādus datus:

9.000031

8.99999999999983

Šeit jūs varat redzēt, ka neliela atšķirība starp pludiņa un dubultā precizitāti sniedz atšķirīgu atbildi, kaut arī Double šķiet precīzāka nekā Float.

Šis ir sqrt () funkcijas piemērs C:

# iekļaut

# iekļaut

int galvenā ()

pludiņa num1 = sqrt (2382719676512365.1230112312312312);

dubultā num2 = sqrt (2382719676512365.1230112312312312);

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

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

getčars ();

Tas dod šādu rezultātu:

48813108.000000

48813109.678778

Šeit var redzēt, ka dubultā atbilde ir precīzāka.

Kopumā ar peldošā komata aritmētiku labāk ir izmantot Double, jo vairākas standarta C matemātiskās funkcijas darbojas uz Double un mūsdienu datori ir ārkārtīgi ātri un efektīvi dubultā peldošā komata aprēķiniem. Tas noved pie tā, ka tiek samazināta vajadzība lietot pludiņu, ja vien jums nav jādarbojas ar daudziem peldošā komata numuriem (domājiet par lieliem blokiem, kuru skaitļos ir tūkstošiem 0), vai arī jūs darbojaties sistēmā, kas neatbalsta dubultā precīza peldošā komata, jo daudzi GPU, mazjaudas ierīces un noteiktas platformas (ARM Cortex-M2, Cortex-M4 utt.) vēl neatbalsta Double, tad jums vajadzētu izmantot Float. Turklāt jāatceras arī tas, ka daži GPU / CPU darbojas labāk / efektīvāk Float apstrādē, piemēram, vektoru / matricas aprēķinā, tāpēc jums, iespējams, nāksies ieskatīties aparatūras specifikācijas rokasgrāmatā / dokumentācijā, lai labāk izlemtu, kurš no jums jāizmanto. konkrētai mašīnai.

Mūsdienu datoriem paredzētajā kodā reti ir iemesls izmantot Double, nevis Double. Papildu precizitāte programmā Double samazina, bet nenovērš noapaļošanas kļūdu vai citu neprecizitāšu iespēju, kas var radīt problēmas citās programmas daļās. Daudzas matemātiskās funkcijas vai operatori pārveido un atdod dubultā, tāpēc jums skaitļi nav jāatsūta atpakaļ uz pludiņu, jo tas var zaudēt precizitāti. Lai veiktu sīku peldošā komata aritmētikas analīzi, es ļoti iesaku jums izlasīt šo apbrīnojamo rakstu (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Kopsavilkums

Tātad… īsumā:

Vietas, kur jums vajadzētu lietot pludiņu:

  • Ja jūs mērķējat uz aparatūru, kur viena precizitāte ir ātrāka nekā divkārša precizitāte.
  • Jūsu lietojumprogrammā tiek izmantota peldošā komata aritmētika, piemēram, tūkstošiem ciparu ar tūkstošiem nulles.
  • Jūs veicat ļoti zemu līmeņa optimizāciju. Piemēram, jūs izmantojat īpašas CPU instrukcijas (t.i., SSE, SSE2, AVX utt.), Kas vienlaikus darbojas ar vairākiem numuriem / masīviem / vektoriem.

Secinājums

Šajā rakstā esmu uzsvēris atšķirību starp pludiņu un dubulto, un to, kurš no tiem jāizmanto konkrētās vietās. Iespējams, ka Double ir labāk izmantot akli, it īpaši, ja mērķauditorija tiek atlasīta pēc moderniem datoriem, jo ​​ir maz ticams, ka ir zema efektivitāte, pateicoties Double peldošā komata aritmētikas izmantošanai. Ja jums ir kādi jautājumi, varat tos uzdot zemāk esošajā komentāru sadaļā!