Domanda

Anni fa ho imparato a fondo i problemi di precisione con i galleggianti, quindi ho smesso di usarli. Tuttavia, mi imbatto ancora in codice usando float e mi fa rabbrividire perché so che alcuni dei calcoli saranno imprecisi.

Quindi, quando è appropriato usare un float?

Modifica Come informazione, non penso di essermi imbattuto in un programma in cui l'accuratezza di un numero non è importante. Ma sarei interessato a sentire esempi.

È stato utile?

Soluzione

Risposta breve: devi solo usare un float quando sai esattamente cosa stai facendo e perché.

Risposta lunga: float (al contrario di doppi ) non sono più utilizzati al di fuori delle API 3D per quanto ne so. I float e i doppi hanno le stesse caratteristiche prestazionali sulle CPU moderne, i doppi sono un po 'più grandi e basta. In caso di dubbio, basta usare double.

Oh sì, e usa decimale per i calcoli finanziari, ovviamente.

Altri suggerimenti

Tutti i calcoli in virgola mobile sono imprecisi in un caso generale, galleggiano più del doppio. Se vuoi maggiori informazioni leggi Ciò che ogni scienziato informatico dovrebbe sapere sull'aritmetica in virgola mobile

Per quanto riguarda quando usare i float - sono spesso usati quando la precisione è meno importante del risparmio di memoria. Ad esempio semplici simulazioni di particelle nei videogiochi.

Per prima cosa, non usare mai float o doppi se si desidera rappresentare esattamente i valori decimali - usare tipi interi (int, long etc) o decimali (che è solo un tipo intero con un fattore di ridimensionamento). I float e i doppi vengono convertiti internamente in una rappresentazione esponenziale nella base 2 e i numeri rappresentati esattamente in una rappresentazione esponenziale nella base 10 non possono in generale essere rappresentati esattamente. (Ad esempio, il numero 10 è rappresentato approssimativamente solo da float o doppi).

In secondo luogo, in termini di precisione dipende da ciò di cui hai bisogno. Non sono d'accordo con il tuo sentimento che non ci sono mai calcoli in cui la precisione non ha importanza. Normalmente hai un'esigenza specifica che il tuo risultato finale sia preciso, 3 cifre. Non ha senso cercare la massima precisione possibile se i tuoi input hanno solo una precisione limitata: supponi di pesare circa 5 g di farina e che la tua bilancia abbia solo una precisione di 0,5 g. Detto questo, i calcoli intermedi di solito beneficiano di una maggiore precisione, ma qualcosa di più importante dell'alta precisione se abbastanza spesso velocità.

In terzo luogo, quando si esegue una serie di calcoli, ad esempio all'interno di un ciclo, è necessario sapere cosa si sta facendo quando si affrontano calcoli inesatti: si verificheranno errori di arrotondamento e alcuni algoritmi potrebbero non arrivare a una risposta a nessuno grado di precisione. Comprendere questi problemi in dettaglio può richiedere un corso di analisi numerica. Questo non dipende dal fatto che tu scelga float o double per i tuoi calcoli.

Per i calcoli in virgola mobile di solito andrei con i doppi poiché sono più generali e più veloci dei float. Tuttavia, i float sono più piccoli e se è necessario memorizzarne molti, sono la scelta per prevenire problemi di prestazioni dovuti a mancati cache.

Per quanto ne so, l'elaborazione in virgola mobile è supportata nell'hardware per doppi ma non float, quindi l'utilizzo di float comporta una conversione in double. Tuttavia, alcune routine si fermerebbero prima quando si calcola un valore in modo iterativo quando si passa un float, poiché ciò implica che si desidera solo una precisione di circa 8 cifre rispetto a circa 16 per i doppi.

Ci sono molti casi in cui vorresti usare un float . Quello che non capisco comunque, è quello che puoi usare invece. Se intendi usare double invece di float , allora sì, nella maggior parte dei casi, vuoi farlo. Tuttavia, double avrà anche problemi di precisione. Dovresti usare decimale ogni volta che l'accuratezza è importante.

float e double sono molto utili in molte applicazioni. decimale è un tipo di dati costoso e il suo intervallo (l'entità del numero più grande che può rappresentare) è inferiore a double . I computer di solito hanno un supporto a livello hardware speciale per questi tipi di dati. Sono usati molto nell'informatica scientifica. Fondamentalmente, sono tipi primari di dati frazionari che si desidera utilizzare. Tuttavia, nei calcoli monetari, dove la precisione è estremamente importante, decimale è la strada da percorrere.

Il motivo più comune che mi viene in mente è di risparmiare spazio. Non che ciò valga la pena preoccuparsi, ma in alcuni casi è importante. Un float occupa la metà della memoria di un doppio, quindi puoi ottenerne il doppio nello stesso spazio. Ad esempio, ho avuto un array di numeri che era troppo grande per adattarsi alla RAM come doppio ma adatto come un array fluttua.

C'è in effetti una cosa in cui è ancora comune usare i float aka "precisione singola" a 32 bit: applicazioni grafiche e stampa.

L'altro motivo sono le schede grafiche con le loro GPU. Più piccolo è il tipo di dati, più veloce l'operazione perché è necessario trasportare meno bit. I tipi di dati interi hanno problemi con immagini ad alta gamma dinamica: l'occhio è in grado di funzionare su una gamma di luminosità di 1: 10 ^ 13 e discerne ca. 4000 livelli. Pertanto, mentre i tipi di dati interi possono memorizzare il numero di livelli, non sono in grado di memorizzare la luminosità dello sfondo mentre i float non hanno problemi. Infatti IEEE 754R consente una nuova "mezza precisione" float con 16 bit e 10 bit mantissa che perde una certa precisione ma consentirebbe una velocità ancora maggiore. OpenGL e DirectX ad es. usare i galleggianti ampiamente. L'occhio è molto indulgente con i manufatti, quindi nessun problema lì.

Tutti gli altri media basati sulla grafica ereditano i float come misura conveniente. La mantissa ha 24 bit permettendo quindi 2 ^ 24 = 16,7 milioni di passi consecutivi. Se si dispone di una stampante con una risoluzione di 2000 dpi, è ancora possibile stampare 213x213 m fogli. Più che sufficiente precisione.

Usa float per prestazioni e dimensioni . Se riesci a gestire la perdita di precisione.

Anche se è vero che un processore moderno impiega lo stesso tempo per elaborare operazioni a precisione singola e doppia, a volte puoi ottenere due volte il throughput se usi float con SIMD (MMX / SSE / ecc. su x86) istruzioni.

I registri SSE hanno una larghezza di 128 bit e possono contenere 4 float o 2 doppi . Quindi, se usato correttamente, puoi fare il doppio delle operazioni con float rispetto ai doppi.

La riduzione delle dimensioni (4 byte anziché 8) diventa importante quando si gestiscono set di dati molto grandi (e la riduzione delle dimensioni di solito migliora anche le prestazioni a causa della memorizzazione nella cache, ecc.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top