Quando usi float e quando usi il double

185

Spesso nella mia esperienza di programmazione ho bisogno di prendere una decisione se dovrei usare float o double per i miei numeri reali. A volte vado per il float, a volte vado per il doppio, ma in realtà questo mi sembra più soggettivo. Se dovessi affrontare la mia decisione, probabilmente non darei ragioni valide.

Quando usi float e quando usi il double? Usi sempre il doppio, solo quando i vincoli di memoria sono presenti vai per il float? O usi sempre float a meno che il requisito di precisione non richieda l'uso doppio? Ci sono delle differenze sostanziali riguardo alla complessità computazionale dell'aritemica di base tra galleggiante e doppio? Quali sono i pro e i contro dell'uso di float o double? E hai persino usato il doppio lungo?

    
posta Jakub Zaverka 28.02.2013 - 11:35
fonte

7 risposte

176

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

float dovrebbe essere usato solo se hai bisogno di operare su molti numeri in virgola mobile (pensa nell'ordine di migliaia o più) e l'analisi dell'algoritmo ha dimostrato che la gamma ridotta e l'accuratezza non pongono un problema.

long double può essere usato se hai bisogno di più range o accuratezza di double , e se lo fornisce sulla tua piattaforma di destinazione.

In sintesi, float e long double devono essere riservati agli specialisti, con double per l'utilizzo "ogni giorno".

    
risposta data 28.02.2013 - 11:50
fonte
41

Raramente si usa il float al posto del doppio codice nel targeting dei computer moderni. La precisione extra riduce (ma non elimina) la possibilità di errori di arrotondamento o altre imprecisioni che causano problemi.

I motivi principali per cui posso pensare di usare float sono:

  1. Stai memorizzando grandi matrici di numeri e devi ridurre il tuo consumo di memoria del programma.
  2. Hai come target un sistema che non supporta in modo nativo un virgola mobile a precisione doppia. Fino a poco tempo fa, molte schede grafiche supportavano solo la precisione singola punti galleggianti. Sono sicuro che ci sono un sacco di bassa potenza e processori embedded con supporto in virgola mobile limitato.
  3. Stai mirando all'hardware in cui la precisione singola è più veloce di precisione doppia, e la tua applicazione fa un uso pesante di aritmetica in virgola mobile. Sulle moderne CPU Intel credo in tutto i calcoli in virgola mobile vengono eseguiti in doppia precisione, quindi tu non guadagnare nulla qui.
  4. Stai facendo un'ottimizzazione di basso livello, ad esempio utilizzando speciali istruzioni della CPU che operano su più unità numeri alla volta.

Quindi, in pratica, il doppio è la strada da percorrere se non si hanno limitazioni hardware o se l'analisi non ha dimostrato che l'archiviazione di numeri a precisione doppia contribuisce in modo significativo all'utilizzo della memoria.

    
risposta data 01.03.2013 - 01:28
fonte
10

Usa double per tutti i tuoi calcoli e le variabili temporanee. Usa float quando devi mantenere una matrice di numeri - float[] (se la precisione è sufficiente) e hai a che fare con decine di migliaia di% di% difloat.

Molte / molte funzioni matematiche o operatori convertono / restituiscono double e non vuoi riportare i numeri a float per i passaggi intermedi.

es. Se hai un input di 100.000 numeri da un file o da un flusso e devi ordinarli, inserisci i numeri in float[] .

    
risposta data 28.02.2013 - 21:11
fonte
5

Alcune piattaforme (ARM Cortex-M2, Cortex-M4, ecc.) non supportano double (possono sempre essere controllate nel manuale di riferimento del processore.) Se non ci sono avvisi o errori di compilazione , non significa che il codice sia ottimale. double può essere emulato). Questo è il motivo per cui potrebbe essere necessario attenersi a int o float .

Se così non fosse, userei double .

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

link

    
risposta data 22.09.2014 - 22:48
fonte
3

Per i problemi del mondo reale la soglia di campionamento dei dati è importante quando si risponde a questa domanda. Allo stesso modo, anche il rumore è importante. Se uno dei due viene superato dalla selezione del tipo di dati, nessun vantaggio verrà dalla crescente precisione.

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

La doppia precisione arriva al costo della memoria 2x. Pertanto limitare l'uso di doppio rispetto ai float potrebbe ridurre drasticamente l'ingombro di memoria / larghezza di banda delle applicazioni in esecuzione.

    
risposta data 19.08.2014 - 18:50
fonte
-3

La scelta della variabile da utilizzare tra virgola mobile e doppia dipende dalla precisione dei dati richiesti. Se è richiesta una risposta per avere una differenza trascurabile rispetto alla risposta effettiva, il numero di cifre decimali richieste sarà molte, quindi imporrà che il doppio sia in uso. Flood taglierà la parte di alcune posizioni decimali riducendo così l'accuratezza.

    
risposta data 07.02.2015 - 11:33
fonte
-5

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

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

Lo standard C99 dice questo:

There are three floating point types: float, double, and long double. The type double provides at least as much precision as float, and the type long double provides at least as much precision as double. The set of values of the type float is a subset of the set of values of the type double; the set of values of the type double is a subset of the set of values of the type long double.

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

Per ulteriori informazioni su Double vs Float , vedi questa domanda a SO .

    
risposta data 28.02.2013 - 11:49
fonte

Leggi altre domande sui tag