Differenza tra galleggiante e doppio - quale dovrei usare? Differenza tra
(Nota: questo articolo presume che i lettori siano a conoscenza dei fondamenti dell'informatica)
Molti programmatori / studenti newbie che si iscrivono a Computer Science pongono le domande più frequenti relative al particolare ambito dell'Informatica che studiano. La maggior parte dei corsi per principianti inizia con gli argomenti del sistema numerico utilizzato nei computer moderni, tra cui 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 i dati in serie di cifre binarie (cioè, nella combinazione di1s e 0s , come 1111 rappresenta 15 nel sistema decimale), ha senso insegnare i diversi formati numerici che sono usati per rappresentare un intervallo dinamico di valori, perché costituiscono i blocchi di base dell'elaborazione del calcolo / numero in qualsiasi tipo di operazione. Una volta che il sistema numerico è definito in classe (spesso scarsamente), gli studenti sono tentati di passare ai diversi formati numerici all'interno dello stesso tipo (vale a dire, aritmetica a 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 Float e Double , e mentre hanno lo stesso obiettivo (cioè aritmetica in virgola mobile ), ci sono abbastanza qualche differenza 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.
Float vs Double … Qual è l'accordo?
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, ad esempio
20. 123 , 16. 23 , 10. 2 , ecc., Non sono numeri interi (cioè 2 , 5 , 15 , ecc.), Quindi richiedono la considerazione di frazioni nel binario. Come i numeri decimali risultanti (per esempio, 20, 123 , 16. 23 , ecc.) non può essere facilmente rappresentato con un normale formato binario (cioè, numero 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.
#include
int main () {
float num1 = 1. f / 82;
float num2 = 0;
per (int i = 0; i <738; ++ i)
num2 + = num1;
printf ("%. 7g n", num2);
doppio num3 = 1. 0/82;
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 fornisce una risposta diversa, anche se Double sembra essere più preciso di Float.
#include
#include
int main () {
float num1 = sqrt (2382719676512365. 1230112312312312);
double num2 = sqrt (2382719676512365. 1230112312312312);
printf ("% f n", num1);
printf ("% f n", num2);
getchar ();
}
Fornisce il seguente output:
48813108. 000000
48.813.109. 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 operano 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 (si pensi 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, poiché 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 invece 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 articolo fantastico (// docs. Oracle. Com / cd / E19957-01 / 806-3568 / ncg_goldberg. Html).
Riepilogo
Quindi … in poche parole:
Luoghi in cui dovresti usare Float:
Se stai mirando all'hardware dove 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 a basso livello. Ad esempio, si stanno utilizzando istruzioni CPU speciali (ad esempio, SSE, SSE2, AVX, ecc.) Che operano su più numeri / array / vettori alla volta.