În mod frecvent în experiența mea de programare, trebuie să iau o decizie dacă ar trebui să folosesc float sau double pentru realul meu numere. Uneori mă duc la float, uneori mă duc la dublu, dar într-adevăr acest lucru se simte mai subiectiv. Dacă aș fi confruntat pentru a-mi apăra decizia, probabil că nu aș da motive temeinice.

Când folosești float și când folosești dublul? Folosești întotdeauna dublu, doar când există constrângeri de memorie, mergi la float? Sau folosiți întotdeauna float, cu excepția cazului în care cerința de precizie necesită utilizarea dublului? Există unele diferențe substanțiale în ceea ce privește complexitatea de calcul a aritemticii de bază între float și dublu? Care sunt avantajele și dezavantajele utilizării float sau double? Și ați folosit chiar dublu lung?

Comentarii

  • În multe cazuri nu doriți să utilizați niciunul, ci mai degrabă un tip zecimal flotant sau tip fix. Tipurile binare cu virgulă mobilă nu pot ‘ să reprezinte exact cele mai multe zecimale.
  • În legătură cu Ce cauzează erorile de rotunjire a virgulelor mobile ? . @CodesInChaos răspunsul meu sugerează resurse care să vă ajute să luați această determinare, nu există o soluție potrivită pentru toți .
  • Ce vrei să spui exact prin ” zecimale „. Dacă trebuie să reprezentați exact valori cum ar fi 0,01 (să zicem, pentru bani), atunci virgula mobilă (binară) nu este răspunsul. Dacă pur și simplu înseamnă numere care nu sunt întregi, atunci virgula mobilă este probabil ok – dar atunci ” zecimale ” nu este cel mai bun cuvânt pentru a descrie ce aveți nevoie.
  • Având în vedere (începând de astăzi) majoritatea plăcilor grafice acceptă flotări peste duble, programarea grafică utilizează adesea o singură precizie.
  • Nu aveți ‘ nu aveți întotdeauna de ales. De exemplu, pe platforma Arduino, atât dublu cât și plutitor echivalează cu plutitor. Trebuie să găsiți o bibliotecă de completare pentru a gestiona dubluri reale.

Răspuns

Alegerea implicită pentru un tipul cu virgulă mobilă ar trebui să fie double. Acesta este, de asemenea, tipul pe care îl obțineți cu literele în virgulă mobilă fără un sufix sau (în C) funcții standard care operează pe numere în virgulă mobilă (de ex., exp, sin etc.).

float trebuie utilizat numai dacă trebuie să operați pe o mulțime de numere în virgulă mobilă (gândiți-vă la ordinea a mii sau mai multe) și analiza algoritmului au arătat că intervalul redus și precizia nu reprezintă o problemă.

long double poate fi utilizat dacă aveți nevoie de mai multă autonomie sau precizie decât double și, dacă acesta oferă acest lucru pe platforma dvs. țintă.

În rezumat, float și long double ar trebui rezervate pentru utilizare de către specialiști, cu double pentru utilizare „în fiecare zi”.

Comentarii

  • Probabil că nu aș considera float pentru câteva mii de valori decât dacă ar exista o problemă de performanță legată de cachin cu virgulă mobilă g și transferul de date. Analiza este de obicei un cost substanțial pentru a arăta că float-ul este suficient de precis.
  • Ca addendum, dacă aveți nevoie de compatibilitate cu alte sisteme, poate fi avantajos să utilizați aceleași tipuri de date.
  • Am ‘ folosit flotante pentru milioane de numere, nu pentru 1000. De asemenea, unele GPU-uri se descurcă mai bine cu floats, în acest caz specializat folosesc floats. Altfel, după cum spui, folosește duble.
  • @PatriciaShanahan – ‘ problemă de performanță legată de .. ‘ A un bun exemplu este dacă intenționați să utilizați SSE2 sau instrucțiuni vectoriale similare, puteți face 4 operații / vector în float (față de 2 pe dublă), ceea ce poate oferi o îmbunătățire semnificativă a vitezei (jumătate din numărul de operații și jumătate din numărul de date de citit & scrie). Acest lucru poate scădea semnificativ pragul în care utilizarea flotantelor devine atractivă și merită probleme pentru a rezolva problemele numerice.
  • Susțin acest răspuns cu un sfat suplimentar: când cineva funcționează cu valori RGB pentru afișare, acesta este acceptabil de utilizat float (și ocazional cu jumătate de precizie) deoarece nici ochiul uman, ecranul sau sistemul de culori nu au atât de mulți biți de precizie. Acest sfat este aplicabil pentru OpenGL, etc. Acest sfat suplimentar nu se aplică imaginilor medicale, care au cerințe de precizie mai stricte.

Răspuns

Rareori există o cauză pentru utilizarea float în loc de dublu în codul care vizează computerele moderne. Precizia suplimentară reduce (dar nu elimină) șansa de rotunjire a erorilor sau a altor imprecizii care provoacă probleme.

Principalele motive pentru care mă gândesc să folosesc float sunt:

  1. Stocați matrici mari de numere și trebuie să reduceți consumul de memorie al programului.
  2. Vizați un sistem care nu acceptă în mod nativ virgulă mobilă cu precizie dublă. Până de curând, multe plăci grafice acceptau doar virgule mobile de precizie. Sunt sigur că există o mulțime de procesoare încorporate de mică putere și care au suport limitat în virgulă mobilă.
  3. Vizați hardware unde precizia simplă este mai rapidă decât precizia dublă, iar aplicația dvs. folosește intens la procesorele Intel moderne cred că toate calculele în virgulă mobilă se fac cu precizie dublă, deci nu câștigați nimic aici.
  4. Faceți optimizare la nivel scăzut, de exemplu, folosind instrucțiuni speciale ale procesorului care funcționează pe mai multe numere la un moment dat.

Deci, practic, dublul este calea către mergeți dacă nu aveți limitări hardware sau dacă analiza nu a arătat că stocarea numerelor cu precizie dublă contribuie semnificativ la utilizarea memoriei.

Comentarii

  • ” Calculatoare moderne ” adică procesoare Intel x86. Unele dintre mașinile utilizate de Antici au oferit o precizie perfectă adecvată cu tipul de plutitor de bază. (CDC 6600 a folosit un cuvânt de 60 de biți, 48 de biți de mantisă normală în virgulă mobilă, 12 biți de exponent. Asta ‘ este APROAPE ceea ce vă oferă x86 pentru o precizie dublă.)
  • @ John.R.Strohm: a fost de acord, dar compilatoarele C nu existau pe CDC6600. Era Fortran IV …
  • Prin ” calculatoare moderne ” mă refer la orice procesor construit în ultimul deceniu sau două, sau într-adevăr, deoarece standardul IEEE în virgulă mobilă a fost implementat pe scară largă. ‘ sunt perfect conștient de faptul că există arhitecturi non-x86 și am avut acest lucru în minte cu răspunsul meu – am menționat GPU-uri și procesoare încorporate, care de obicei nu sunt x86.
  • Totuși, ‘ nu este adevărat. SSE2 poate manipula 4 flotări sau 2 duble într-o singură operație, AVX poate manipula 8 flotări sau 4 duble, AVX-512 poate manipula 16 flotări sau 8 duble. Pentru orice tip de calcul de înaltă performanță, matematica pe flotori ar trebui considerată de două ori mai mare decât viteza acelorași operații pe dubluri pe x86.
  • Și ‘ s chiar mai rău de atât, deoarece puteți încadra de două ori mai multe flotante în memoria cache a procesorului cu dubluri, iar latența memoriei este probabil principalul blocaj în multe programe. Păstrarea unui set întreg de flotori de lucru calde în cache poate fi literalmente o ordine de mărime mai rapidă decât utilizarea dublurilor și trimiterea lor la RAM.

Răspuns

Utilizați double pentru toate calculele și variabilele temp. Utilizați float atunci când trebuie să mențineți o serie de numere – float[] (dacă precizia este suficientă) și aveți de-a face cu peste zeci de mii de float numere.

Multe / majoritatea funcțiilor sau operatorilor matematici convertesc / returnează double, iar tu nu ” nu vreau să aruncați numerele înapoi la float pentru orice pași intermediari.

De exemplu, dacă aveți o intrare de 100.000 de numere dintr-un fișier sau un flux și trebuie să sortați-le, puneți numerele într-un float[].

Răspundeți

Unele platforme (ARM Cortex-M2, Cortex-M4 etc) nu suportați dublu (Poate fi verificat întotdeauna în manualul de referință către procesorul dvs. Dacă nu există avertismente sau erori de compilare, nu înseamnă că codul este optim. dublu poate fi imitat .). De aceea, poate fi necesar să rămâneți la int sau float .

Dacă nu este cazul, aș folosi dublu .

Puteți verifica faimosul articol al lui D. Goldberg („Ce ar trebui să știe fiecare informatician despre aritmetica în virgulă mobilă”). Ar trebui să vă gândiți de două ori înainte de a utiliza aritmetica în virgulă mobilă. Există șanse destul de mari să nu fie deloc necesare în situația dvs. particulară.

http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf

Comentarii

  • Această întrebare a primit deja un răspuns destul de bine acum un an …dar, în orice caz, ‘ spun de fiecare dată când ‘ folosiți dublu pe platforme cu accelerație FPU de precizie dublă, ar trebui să utilizați pe orice altul, chiar dacă asta înseamnă să lăsați compilatorul să-l emuleze în loc să profite de o FPU doar cu virgulă mobilă (rețineți că FPU ‘ s nu sunt ‘ nu este necesar nici pe toate platformele, de fapt o arhitectură Cortex-M4 le definește ca o caracteristică opțională [era M2 o greșeală de tipar?]).
  • Cheia acestei logici este, în timp ce ‘ adevărat ar trebui să fie obosit de aritmetică în virgulă mobilă și ‘ este mulți ” quirks „, cu siguranță că nu luăm prezența suportului FPU pentru dubluri pentru a însemna pur și simplu să utilizăm duble în loc de plutitoare. Flotările sunt, în general, mai rapide decât cele duble și ocupă mai puțină memorie (caracteristicile FPU variază). Volumul de utilizare împiedică acest punct să fie optimizat prematur. La fel și faptul că dublurile sunt în mod clar exagerate pentru multe (poate chiar și pentru majoritatea) aplicațiilor. Este necesar ca elementele de pe această pagină să aibă pozițiile și dimensiunile relative calculate la 13 zecimale?
  • Când includeți un link către o pagină sau un document în afara site-ului, vă rugăm să copiați informațiile relevante sau rezumatul din document în răspunsul dvs. Linkurile off site au tendința de a dispărea în timp.

Răspuns

Pentru problemele din lumea reală, pragul de eșantionare a datele dvs. sunt importante atunci când răspundeți la această întrebare. În mod similar, podeaua de zgomot este de asemenea importantă. Dacă oricare dintre acestea este depășită de tipul de date selectat, nu va avea niciun avantaj din creșterea preciziei.

Majoritatea eșantioanelor din lumea reală sunt limitate la DAC-uri pe 24 de biți. Sugerând că 32 de biți de precizie în calculele din lumea reală ar trebui să fie adecvate acolo unde semnificația este de 24 de biți de precizie.

Precizia dublă costă 2x de memorie. Prin urmare, limitarea utilizării dublelor peste plutitoare ar putea reduce drastic amprenta de memorie / lățimea de bandă a aplicațiilor care rulează.

Răspuns

Alegerea ce variabilă să utilizați între float și double depinde de acuratețea datelor necesare. Dacă este necesar ca un răspuns să aibă o diferență neglijabilă față de răspunsul real, numărul de zecimale necesare va fi mai mare, deci va dicta ca dublul să fie utilizat. Flotorul va tăia unele părți de zecimale, reducând astfel precizia.

Comentarii

  • Acest răspuns nu ‘ nu adaugă nimic nou la întrebare și nu spune nimic util.

Răspuns

De obicei, folosesc tipul float Nu am nevoie de multă precizie – de exemplu, pentru bani – ceea ce este greșit, dar este ceea ce făceam în mod greșit.

Pe de altă parte, folosesc double când am nevoie de mai multă precizie, de exemplu pentru algoritmi matematici complexi.

Standardul C99 spune acest lucru:

Există trei tipuri de virgulă mobilă: float, dublu și dublu lung. Tipul dublu oferă cel puțin la fel de multă precizie ca și float, iar tipul dublu lung oferă cel puțin la fel de multă precizie ca dublu. Setul de valori al tipului float este un subset al setului de valori al tipului double; setul de valori ale tipului double este un subset al setului de valori al tipului double double.

Nu am folosit niciodată cu adevărat long double, dar nu folosesc atât de mult C / C ++. De obicei folosesc limbaje tastate dinamic, cum ar fi Python, unde nu trebuie să îți pese de tipuri.

Pentru informații suplimentare despre Double vs Float , consultați această întrebare la SO .

Comentarii

  • Utilizarea virgulă mobilă pentru calcule serioase de bani este probabil o greșeală.
  • float este exact tipul greșit pentru bani. Trebuie să utilizați cea mai mare precizie posibilă.
  • @BartvanIngenSchenau Punctul mobil pentru bani este de obicei în regulă, punctul binar nu este valabil. De exemplu .net ‘ s Decimal este un tip cu virgulă mobilă și ‘ este de obicei o alegere bună pentru calculele banilor.
  • @ChrisF Nu aveți ‘ de care nu aveți nevoie ” de înaltă precizie ” pentru bani, aveți nevoie de valori exacte.
  • @SeanMcSomething – Fair point. Cu toate acestea, plutitoarele sunt încă de tip greșit și având în vedere tipurile de virgulă mobilă disponibile în majoritatea limbilor, aveți nevoie de ” de înaltă precizie ” div id = „755ad77b54”>

valori exacte „.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *