Spesso nella mia esperienza di programmazione ho bisogno di prendere una decisione se devo usare float o double per il mio reale numeri. A volte vado per float, a volte vado per il doppio, ma in realtà questo sembra più soggettivo. Se dovessi essere confrontato per difendere la mia decisione, probabilmente non darei valide ragioni.

Quando usi float e quando usi double? Usi sempre double, solo quando sono presenti vincoli di memoria scegli float? O usi sempre il float a meno che il requisito di precisione non richieda di usare il doppio? Ci sono differenze sostanziali per quanto riguarda la complessità computazionale dellarithemtics di base tra float e double? Quali sono i pro e i contro dellutilizzo di float o double? E hai anche usato il doppio lungo?

Commenti

  • In molti casi non vuoi usare nessuno dei due, ma piuttosto un tipo decimale a virgola mobile o fisso. I tipi binari a virgola mobile possono ‘ t rappresentare esattamente la maggior parte dei decimali.
  • Correlati a Quali sono le cause degli errori di arrotondamento in virgola mobile ? . @CodesInChaos mia risposta suggerisce risorse per aiutarti a prendere questa decisione, non esiste una soluzione valida per tutti .
  • Che cosa intendi esattamente con ” decimali “. Se devi rappresentare esattamente valori come 0,01 (ad esempio, per denaro), la virgola mobile (binaria) non è la risposta. Se intendi semplicemente numeri non interi, probabilmente la virgola mobile è ok, ma ” decimals ” non è la parola migliore per descrivere ciò di cui hai bisogno.
  • Considerando (ad oggi) la maggior parte delle schede grafiche accetta i float rispetto ai doppi, la programmazione grafica spesso utilizza la precisione singola.
  • Non ‘ Ho sempre una scelta. Ad esempio, sulla piattaforma Arduino, sia double che float equivalgono a float. Devi trovare una libreria aggiuntiva per gestire i veri doppi.

Risposta

La scelta predefinita per un il tipo a virgola mobile deve essere double. Questo è anche il tipo che ottieni con i letterali in virgola mobile senza suffisso o (in C) funzioni standard che operano su numeri in virgola mobile (ad es. exp, sin, ecc.).

float dovrebbe essere utilizzato solo se devi operare su molti numeri in virgola mobile (pensa in dellordine di migliaia o più) e lanalisi dellalgoritmo ha mostrato che la gamma ridotta e la precisione non rappresentano un problema.

long double può essere utilizzato se hai bisogno di più intervallo o precisione rispetto a double e se lo fornisce sulla tua piattaforma di destinazione.

In sintesi, float e long double devono essere riservati agli specialisti, con double per “tutti i giorni”.

Commenti

  • Probabilmente non considererei il float per alcune migliaia di valori a meno che non ci fosse un problema di prestazioni relativo alla cache in virgola mobile ge trasferimento dei dati. Di solito cè un costo considerevole per fare lanalisi per dimostrare che il float è abbastanza preciso.
  • Come aggiunta, se hai bisogno di compatibilità con altri sistemi, può essere vantaggioso usare gli stessi tipi di dati.
  • I ‘ d uso i float per milioni di numeri, non per i 1000. Inoltre, alcune GPU fanno meglio con i float, in quel caso specializzato usano i float. Altrimenti, come dici tu, usa il doppio.
  • @PatriciaShanahan – ‘ problema di prestazioni relativo a .. ‘ A un buon esempio è che se hai intenzione di utilizzare SSE2 o istruzioni vettoriali simili, puoi eseguire 4 operazioni / vettore in float (contro 2 per doppio) che possono dare un significativo miglioramento della velocità (metà delle operazioni e metà dei dati da leggere & write). Questo può abbassare significativamente la soglia in cui luso di float diventa attraente e vale la pena di risolvere i problemi numerici.
  • Approvo questa risposta con un ulteriore consiglio: quando si opera con valori RGB per la visualizzazione, è accettabile usare float (e occasionalmente mezza precisione) perché né locchio umano, il display o il sistema di colori hanno così tanti bit di precisione. Questo consiglio è applicabile per esempio OpenGL ecc. Questo consiglio aggiuntivo non si applica alle immagini mediche, che hanno requisiti di precisione più severi.

Risposta

Raramente cè motivo di usare float invece di double nel codice che mira ai computer moderni. La precisione extra riduce (ma non elimina) la possibilità di errori di arrotondamento o altre imprecisioni che causano problemi.

Le ragioni principali che posso pensare di usare float sono:

  1. Stai memorizzando grandi array di numeri e hai bisogno di ridurre il consumo di memoria del tuo programma.
  2. Stai prendendo di mira un sistema che non supporta nativamente la virgola mobile a doppia precisione. Fino a poco tempo, molte schede grafiche supportavano solo punti mobili a precisione singola. Sono sicuro che ci sono molti processori a basso consumo e incorporati che hanno anche un supporto in virgola mobile limitato.
  3. Stai prendendo di mira hardware in cui la precisione singola è più veloce della precisione doppia e la tua applicazione fa un uso intenso di aritmetica in virgola mobile Sulle moderne CPU Intel credo che tutti i calcoli in virgola mobile siano eseguiti con doppia precisione, quindi qui non si guadagna nulla.
  4. Stai eseguendo unottimizzazione di basso livello, ad esempio utilizzando istruzioni speciali della CPU che operano su più numeri contemporaneamente.

Quindi, fondamentalmente, il doppio è il modo per vai a meno che tu non abbia limitazioni hardware o lanalisi non abbia dimostrato che la memorizzazione di numeri a doppia precisione contribuisce in modo significativo allutilizzo della memoria.

Commenti

  • ” Computer moderni ” significa processori Intel x86. Alcune delle macchine utilizzate dagli antichi fornivano una precisione perfettamente adeguata con il tipo di galleggiante di base. (Il CDC 6600 utilizzava una parola a 60 bit, 48 bit di mantissa a virgola mobile normalizzata, 12 bit di esponente. Questo ‘ è QUASI ciò che lx86 ti offre per la doppia precisione.)
  • @ John.R.Strohm: daccordo, ma i compilatori C non esistevano su CDC6600. Era Fortran IV …
  • Per ” computer moderni ” intendo qualsiasi processore costruito nellultimo decennio o due, o davvero, poiché lo standard IEEE in virgola mobile era ampiamente implementato. ‘ sono perfettamente consapevole che esistono architetture non x86 e lo avevo in mente con la mia risposta: ho citato GPU e processori incorporati, che in genere non sono x86.
  • Questo ‘ semplicemente non è vero, però. SSE2 può manipolare 4 float o 2 double in ununica operazione, AVX può manipolare 8 float o 4 double, AVX-512 può manipolare 16 float o 8 double. Per qualsiasi tipo di calcolo ad alte prestazioni, la matematica su float dovrebbe essere considerata come una velocità doppia rispetto alle stesse operazioni su double su x86.
  • E ‘ s anche peggio, dal momento che puoi inserire il doppio dei float nella cache del processore che puoi con double, e la latenza della memoria è probabilmente il principale collo di bottiglia in molti programmi. Mantenere un intero set funzionante di float al caldo nella cache può essere letteralmente un ordine di grandezza più veloce che usare i doppi e farli riversare nella RAM.

Risposta

Utilizza double per tutti i calcoli e le variabili temporanee. Utilizza float quando devi mantenere un array di numeri – float[] (se la precisione è sufficiente) e hai a che fare con oltre decine di migliaia di float numeri.

Molte / la maggior parte delle funzioni o degli operatori matematici convertono / restituiscono double, e tu non ” non voglio restituire i numeri a float per qualsiasi passaggio intermedio.

Ad esempio, se hai un input di 100.000 numeri da un file o da uno stream e devi ordinarli, inserire i numeri in un float[].

Risposta

Alcune piattaforme (ARM Cortex-M2, Cortex-M4 e così via) non supportano double (Può sempre essere controllato nel manuale di riferimento al processore. Se non sono presenti errori o avvisi di compilazione, non significa che il codice sia ottimale. È possibile emulare double .). Ecco perché potrebbe essere necessario attenersi a int o float .

Se non è così, utilizzerei double .

Puoi controllare il famoso articolo di D. Goldberg (“Quello che ogni informatico dovrebbe sapere sullaritmetica in virgola mobile”). Dovresti pensarci due volte prima di usare laritmetica in virgola mobile. Cè una grande possibilità che non siano affatto necessari nella tua situazione particolare.

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

Commenti

  • Questa domanda ha già ricevuto una risposta abbastanza buona un anno fa …ma in ogni caso, ‘ direi che ogni volta che ‘ utilizzi double su piattaforme con accelerazione FPU a doppia precisione, dovresti utilizzare su qualsiasi altro, anche se questo significa lasciare che il compilatore lo emuli invece di sfruttare un FPU solo con virgola mobile (nota che FPU ‘ s aren ‘ neppure richiesto su tutte le piattaforme, infatti unarchitettura Cortex-M4 le definisce come una caratteristica opzionale [M2 era un errore di battitura?]).
  • La chiave di questa logica è, mentre è ‘ vero dovrebbe essere stanco dellaritmetica in virgola mobile, e ‘ i molti ” stranezze “, decisamente non prendendo la presenza del supporto FPU per i doppi per significare semplicemente usare i doppi invece dei float. I float sono generalmente più veloci dei doppi e richiedono meno memoria (le caratteristiche dellFPU variano). Il volume di utilizzo impedisce a questo punto di essere ottimizzato prematuramente. Come il fatto, i doppi sono chiaramente eccessivi per molte (forse anche la maggior parte) applicazioni. Gli elementi di questa pagina devono davvero avere le loro posizioni e dimensioni relative calcolate con 13 cifre decimali?
  • Quando includi un link a una pagina o un documento fuori sito, copia il informazioni pertinenti, o riepilogo, dal documento nella risposta. I collegamenti esterni al sito hanno la tendenza a scomparire nel tempo.

Risposta

Per i problemi del mondo reale la soglia di campionamento di i tuoi dati sono importanti quando rispondi a questa domanda. Allo stesso modo, anche il rumore di fondo è importante. Se uno dei due viene superato dalla selezione del tipo di dati, non si otterrà alcun vantaggio dallaumento della precisione.

La maggior parte dei campionatori del mondo reale sono limitati a DAC a 24 bit. Suggerendo che 32 bit di precisione sui calcoli del mondo reale dovrebbero essere adeguati dove il significato è 24 bit di precisione.

La doppia precisione ha un costo di 2x memoria. Pertanto, limitare luso di double over float potrebbe ridurre drasticamente limpronta di memoria / larghezza di banda delle applicazioni in esecuzione.

Answer

La scelta di quale variabile usare tra float e double dipende dallaccuratezza dei dati richiesti. Se una risposta è richiesta per avere una differenza trascurabile dalla risposta effettiva, il numero di cifre decimali richieste sarà molte, quindi imporrà che il doppio sia in uso.Float taglierà alcune cifre decimali riducendo così la precisione.

Commenti

  • Questa risposta ‘ non aggiunge nulla di nuovo alla domanda e non dice nulla di reale utilizzo.

Risposta

Di solito, utilizzo il tipo float quando Non ho bisogno di molta precisione, ad esempio per soldi, il che è sbagliato, ma è quello che sono abituato a fare in modo sbagliato.

Daltra parte, utilizzo double quando ho bisogno di maggiore precisione, ad esempio per algoritmi matematici complessi.

Lo standard C99 dice questo:

Esistono tre tipi di virgola mobile: float, double e long double. Il tipo double fornisce almeno la stessa precisione del float e il tipo long double fornisce almeno la stessa precisione del double. Linsieme di valori di tipo float è un sottoinsieme dellinsieme di valori di tipo double; linsieme di valori di tipo double è un sottoinsieme dellinsieme di valori di tipo long double.

Non ho mai usato long double, ma io non uso così tanto C / C ++. Di solito uso linguaggi tipizzati dinamicamente come Python, dove non devi preoccuparti dei tipi.

Per ulteriori informazioni su Double vs Float , vedere questa domanda in SO .

Commenti

  • Usare la virgola mobile per calcoli seri di denaro è probabilmente un errore.
  • float è esattamente il tipo sbagliato di denaro. Devi usare la massima precisione possibile.
  • @BartvanIngenSchenau La virgola mobile per soldi di solito va bene, la virgola mobile binaria no. Ad esempio .net ‘ s Decimal è un tipo a virgola mobile e ‘ è tipicamente una buona scelta per i calcoli di denaro.
  • @ChrisF Non ‘ occorre ” alta precisione ” per soldi, hai bisogno di valori esatti.
  • @SeanMcSomething – Giusto punto. Tuttavia, i float sono ancora del tipo sbagliato e, dati i tipi di virgola mobile disponibili nella maggior parte delle lingue, è necessaria ” alta precisione ” per ottenere ” valori esatti “.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *