Domanda

Ci sono situazioni in cui avrebbe più senso utilizzare un solo tipo di dati invece di un doppio? Dalla mia ricerca, lo svantaggio di una doppia è che richiede più spazio, che non è un problema per la maggior parte delle applicazioni. In tal caso, dovrebbero tutti i numeri in virgola mobile in doppio?

Un po 'di informazioni di fondo: Sto lavorando con un programma che si occupa di un sacco di dati circa le coordinate e le sostanze chimiche. Alcuni clienti hanno notato che quando di fogli di calcolo di dati, alcuni valori con alta precisione sono arrotondati giù la precisione di una singola.

È stato utile?

Soluzione

Nella maggior parte delle applicazioni desktop, sì.

Anche se si dispone di una vasta gamma di loro, dimezzando la dimensione di tale potrebbe essere abbastanza significativo per essere utile se non avete bisogno della precisione.

In particolare, dato che praticamente tutti i desktop dei consumatori hanno doppia precisione aritmetica in virgola mobile fatto in hardware.

Altri suggerimenti

questo articolo .net

  

Tipo di dati Larghezza

     

I tipi di dati più efficienti sono   quelli che utilizzano la larghezza di dati nativi   della piattaforma di run-time. su corrente   piattaforme, la larghezza dei dati è di 32 bit,   sia per il computer e il   sistema operativo.

     

Di conseguenza, intero è attualmente il   più efficace tipo di dati in Visual   Basic .NET. Successivo migliori sono lunghi, corti,   e Byte, in questo ordine di efficienza.   È possibile migliorare le prestazioni di   Breve e Byte disattivando intero   controllo troppo pieno, per esempio mediante   l'impostazione dei RemoveIntegerChecks   proprietà, ma questo comporta il rischio di   calcoli errati dovuti a   overflow non rilevati. Non puoi   attivare questo controllo on e off durante   tempo di esecuzione; è possibile impostare solo il suo valore   per la prossima generazione del vostro   applicazione.

     

Se avete bisogno di valori frazionari, i   migliore scelta è doppio, perché la   processori in virgola mobile di corrente   piattaforme eseguire tutte le operazioni di   doppia precisione. Successivo migliori sono single   e decimale, in questo ordine di   efficienza.

Come Mark dice nel suo commento, lo spazio può essere un problema sui sistemi di memoria limitata. Si consiglia inoltre di indicizzare o ordinare un elenco, e perché farlo su raddoppia se è possibile memorizzare i valori in singolare?

Su alcuni hardware, aritmetica coinvolgendo valori doppi può richiedere più tempo di quello che coinvolgono singoli valori, ma più recente FPUs avere un solo tipo di dati nativo (ad esempio, 80 bit estesi corrispondenti per x86 mobile) che verranno utilizzati internamente per i calcoli indipendentemente da ciò che i dati in memoria digitare in uso. Quindi, vale a dire che "i calcoli FPU sarà più veloce con precisione singola" è generalmente non di un motivo per utilizzare in singola precisione sulla maggior parte dell'hardware moderno di oggi.

Detto questo, oltre al "usa meno memoria" motivi elaborati sulle negli altri risposte, c'è una ragione molto pratica quando si tratta di SIMD istruzioni vettoriali come SSE e AltiVec - singola precisione è likey di essere due volte più veloce come doppia precisione, dal momento che le istruzioni operano su vettori di dimensione fissa, e si può farcire il doppio dei valori singola precisione in un unico vettore, con il tempo di elaborazione tipicamente rimanendo lo stesso.

Ad esempio, con un'unità vettoriale a 128 bit in grado di moltiplicazioni elaborazione vettoriale in 2 cicli di clock, si potrebbe ottenere un throughput di 2 moltiplicazioni di precisione singole per ciclo di clock, rispetto a 1 doppia precisione, dal momento che è possibile 4 sceglie in un vettore, contro due doppie.

Un effetto simile si verifica con la larghezza di banda della memoria, e non è specifico per l'elaborazione del vettore - se si dispone di grandi array di doppio, che non solo prendere il doppio dello spazio, ma può richiedere fino a due volte più a lungo per elaborare nel caso in cui l'algoritmo è larghezza di banda limitata (che è sempre più probabile, date le dimensioni crescenti e decrescenti latenze di unità di elaborazione vettoriale).

Doppio prendere più spazio, ma la precisione in più può o non può essere necessario. Ho fatto un sacco di programmazione nel mondo scientifico in cui aritmetica in virgola mobile è molto comune e hanno scoperto che spesso è possibile fare i calcoli a doppia precisione o superiore, ma memorizzare i risultati come singoli senza effetti negativi.

Tenete a mente che una volta che i numeri vengano risucchiati dal FPU, si sono espanse a altissima precisione in ogni caso. Detto questo, sarebbe meglio provare qualsiasi cosa stiate facendo in entrambe le precisioni e vedere se i risultati sono paragonabili.

Purtroppo, computing è ancora una scienza sperimentale.

Se stai codifica OpenGL allora è normale usare GLSingle (ad es singolo), piuttosto che GLDouble. In quasi tutte le circostanze singola precisione è più che sufficiente per la maggior parte delle applicazioni grafiche e dovrebbe essere più veloce - anche se confesso che non sono certo di questo sulla più recente generazione di GPU.

La mia citazione preferita su questo è che singola precisione era sufficiente per passare alla luna e ritorno, quindi, in pratica, è insolito per causare un vero problema. Detto questo nella maggior parte dei casi mi piacerebbe raggiungere per una doppia al giorno d'oggi come deposito è a buon mercato e c'è meno probabilità di essere qualsiasi binario dispari a decimale problemi.

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