Differenza tra galleggiante e doppio - quale dovrei usare?

(Nota: questo articolo presume che i lettori siano a conoscenza delle basi dell'informatica)

Molti programmatori / studenti newbie che sono iscritti in Informatica fanno le domande frequenti che sono rilevanti per il particolare campo dell'Informatica che studiano. La maggior parte dei corsi per principianti inizia con gli argomenti del sistema numerico che viene utilizzato nei computer moderni, incluso il binario, decimale, ottale e esadecimale sistema. Questi sono i formati numerici dei computer che rappresentano le rappresentazioni interne dei valori numerici nei computer (o calcolatori e qualsiasi altro tipo di computer digitale). Questi valori sono memorizzati come "raggruppamento di bit".

Come sappiamo, i computer rappresentano dati in serie di cifre binarie (cioè, nella combinazione di 1s e 0s, ad esempio, 1111 rappresenta 15 nel sistema decimale), ha senso insegnare i diversi formati numerici utilizzati per rappresentare un intervallo dinamico di valori, poiché costituiscono i blocchi di base dell'elaborazione del calcolo / numero in qualsiasi tipo di operazione. Una volta definito il sistema numerico in classe (spesso scarsamente), gli studenti sono tentati di passare a formati di numeri diversi all'interno dello stesso tipo (ad es.., aritmetica in virgola mobile) che hanno una certa precisione e un intervallo numerico. Pertanto, sono costretti a imparare le sfumature tra alcuni tipi. Due dei tipi di dati più comunemente usati sono Galleggiante e Doppio, e mentre si rivolgono agli stessi bisogni (es., aritmetica in virgola mobile), ci sono alcune differenze nella loro rappresentazione interna e l'effetto complessivo sul calcolo nel programma. È un peccato che molti programmatori non rispettino le sfumature tra i tipi di dati Flat e Double e finiscano per utilizzarli in modo inappropriato in luoghi in cui non dovrebbero essere utilizzati in primo luogo. In definitiva, si sono verificati errori di calcolo in altre parti del programma.

In questo articolo, ho intenzione di dirvi la differenza tra float e double con gli esempi di codice nel linguaggio di programmazione C. Iniziamo!

Float vs Double ... Qual è il problema?

Float e Double sono le rappresentazioni dei dati utilizzate per le operazioni aritmetiche in virgola mobile, si pensi ai numeri decimali che si calcolano nella classe di matematica, come, 20,123, 16.23, 10.2, ecc., non sono numeri interi (es., 2, 5, 15, ecc.), quindi richiedono la considerazione delle frazioni nel binario. Come i numeri decimali risultanti (es., 20,123, 16.23, ecc.) non può essere facilmente rappresentato con un normale formato binario (cioè, intero). La differenza principale tra Float e Double è che il primo è rappresentato dai dati in virgola mobile a precisione singola (32 bit), mentre il secondo è di tipo a virgola mobile a precisione doppia (64 bit). Double è chiamato "double" perché è fondamentalmente una versione a doppia precisione di Float. Se stai calcolando una quantità enorme (pensa alle migliaia di 0 nel numero), allora le imprecisioni saranno più piccole nel Double e non perderai molta precisione.

È meglio elaborare usando gli esempi di codice. Di seguito è riportata l'operazione su Float e Double tramite le funzioni matematiche fornite in linguaggio C:

#includere

int main ()

float num1 = 1.f / 82;

float num2 = 0;

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

num2 + = num1;

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

double num3 = 1.0 / 82;

doppio num4 = 0;

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

num4 + = num3;

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

getchar ();

Stampa quanto segue:

9.000031

8,99999999999983

Qui, puoi vedere che la leggera differenza nella precisione di Float e Double dà una risposta completamente diversa, anche se Double sembra essere più preciso di Float.

Di seguito è riportato l'esempio della funzione sqrt () in C:

#includere

#includere

int main ()

float num1 = sqrt (2382719676512365.1230112312312312);

double num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f \ n", num1);

printf ("% f \ n", num2);

getchar ();

Fornisce il seguente risultato:

48813108.000000

48813109.678778

Qui puoi vedere che la risposta in Double ha una precisione migliore.

Tutto sommato, è meglio usare Double per l'aritmetica in virgola mobile, poiché diverse funzioni matematiche standard in C funzionano su Double e i computer moderni sono estremamente veloci ed efficienti per i calcoli in virgola mobile doppio. Ciò porta a ridurre la necessità di utilizzare Float, a meno che non sia necessario operare su molti numeri in virgola mobile (pensare a grandi array con migliaia di 0 nei numeri) o si sta operando su un sistema che non supporta il doppio. punto di virgola mobile di precisione, come molte GPU, dispositivi a bassa potenza e alcune piattaforme (ARM Cortex-M2, Cortex-M4, ecc.) non supportano ancora Double, quindi dovresti usare Float. Inoltre, una cosa da ricordare è che certe GPU / CPU funzionano meglio / efficientemente nell'elaborazione di Float, come nel calcolo di vettori / matrice, quindi potrebbe essere necessario consultare il manuale / documentazione delle specifiche hardware per decidere meglio quale utilizzare per una macchina particolare.

Raramente c'è un motivo per usare Float al posto di Double nel codice che punta ai computer moderni. La precisione extra in Double riduce, ma non elimina, la possibilità di errori di arrotondamento o altre imprecisioni che possono causare problemi in altre parti del programma. Molte funzioni o operatori matematici convertono e restituiscono Double, quindi non è necessario eseguire il cast dei numeri su Float, in quanto ciò potrebbe perdere la precisione. Per un'analisi dettagliata sull'aritmetica in virgola mobile, ti consiglio vivamente di leggere questo fantastico articolo (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Sommario

Quindi ... in poche parole:

Luoghi in cui dovresti utilizzare Float:

  • Se si mira all'hardware in cui la precisione singola è più veloce della precisione doppia.
  • La tua applicazione fa un uso pesante dell'aritmetica in virgola mobile, come migliaia di numeri con migliaia di 0.
  • Stai facendo un'ottimizzazione molto bassa. Ad esempio, stai utilizzando speciali istruzioni della CPU (ad esempio, SSE, SSE2, AVX, ecc.) Che funzionano su più numeri / array / vettori alla volta.

Conclusione

In questo articolo ho evidenziato la differenza tra Float e Double, e quale dovrebbe essere usato in luoghi specifici. Probabilmente, è meglio usare il doppio nella maggior parte dei casi alla cieca, specialmente se si stanno prendendo di mira i computer moderni, poiché le probabilità di bassa efficienza dovute all'uso dell'aritmetica a virgola mobile doppia sono altamente improbabili. Se avete domande, allora potete chiedere nella sezione commenti qui sotto!