Domanda

Quali sono i vantaggi e gli svantaggi di usare uno anziché l'altro in C ++?

È stato utile?

Soluzione

Se vuoi conoscere la risposta vera, si dovrebbe leggere Ciò che ogni Computer Scientist dovrebbe sapere virgola mobile aritmetica .

In breve, anche se double permette maggiore precisione nella sua rappresentazione, per alcuni calcoli produrrebbe errori più grandi . La scelta "giusta" è il seguente:. usare tanto la precisione di cui hai bisogno, ma non di più e scegliere l'algoritmo destra

Molti compilatori hanno esteso matematica a virgola mobile in modalità "non-strict" comunque (cioè utilizzare un tipo in virgola mobile più ampia disponibile in hardware, ad esempio 80 bit e 128 bit galleggianti), questo dovrebbe essere preso in considerazione. In pratica, è possibile a malapena a vedere alcuna differenza in termini di velocità - sono nativi per l'hardware in ogni caso

.

Altri suggerimenti

A meno che non hai qualche motivo specifico per fare altrimenti, utilizzare il doppio.

Sorprendentemente, è doppio e non galleggiante che è del tipo "normale" a virgola mobile in C (e C ++). Le funzioni matematiche standard come sin e login prendere doppie come argomenti, e restituire doppie. Una virgola mobile normale letterale, come quando si scrive 3.14 nel programma, ha il tipo double. Non galleggiare.

Sui computer tipici moderne, doppie possono essere altrettanto veloce come galleggianti, o anche più veloce, quindi le prestazioni di solito non è un fattore da considerare, anche per grandi calcoli. (E quelli avrebbe dovuto essere di grandi dimensioni calcoli, o le prestazioni non dovrebbe nemmeno entrare nella vostra mente. Il mio nuovo computer i7 desktop può fare sei miliardi di moltiplicazioni di doppio in un secondo.)

Questa domanda è impossibile rispondere in quanto non v'è alcun contesto alla domanda. Qui ci sono alcune cose che possono influenzare la scelta:

  1. implementazione del compilatore di carri, doppie e lunghe doppie. Il C ++ stati standard:

      

    Ci sono tre tipi virgola mobile: float, double e long double. Il tipo double fornisce almeno tanto precisione float, e il doppio lungo tipo fornisce almeno tanto precisione doppia.

    Quindi, tutti e tre possono avere la stessa dimensione in memoria.

  2. La presenza di una FPU. Non tutte le CPU hanno FPUs e talvolta i tipi virgola mobile vengono emulati e talvolta i tipi virgola mobile sono solo non supportato.

  3. FPU Architettura. FPU del IA32 è 80bit internamente - galleggianti 32 bit e 64 bit vengono espansi a 80bit del carico e ridotti sul deposito. C'è anche SIMD che può fare quattro carri a 32bit o due galleggianti a 64 bit in parallelo. Uso di SIMD non è definita nello standard quindi richiederebbe un compilatore che fa un'analisi più complessa per determinare se SIMD può essere utilizzato, o richiede l'utilizzo di funzioni speciali (librerie o intrinsics). Il risultato di formato interno 80bit è che si possono ottenere risultati leggermente diversi a seconda di come spesso i dati vengono salvati nella RAM (quindi, la perdita di precisione). Per questo motivo, i compilatori non ottimizzano floating codice punto particolarmente bene.

  4. larghezza di banda di memoria. Se un doppio richiede più spazio di archiviazione di un galleggiante, poi ci vorrà più tempo per leggere i dati. Questa è la risposta ingenua. Su un IA32 moderno, tutto dipende da dove i dati proviene. Se è nella cache L1, il carico è trascurabile fornito i dati provengono da una singola linea di cache. Se si occupa più di una linea di cache c'è una piccola testa. Se è da L2, ci vuole un po ', se è in RAM, allora è ancora più lungo e, infine, se è su disco è un tempo enorme. Quindi la scelta del float o doppia è meno importante del modo in cui vengono utilizzati i dati. Se si vuole fare un piccolo calcolo su un sacco di dati sequenziali, un piccolo tipo di dati è preferibile. Facendo un sacco di calcolo su un piccolo insieme di dati permetterebbe di utilizzare i tipi di dati più grandi con alcun effetto significativo. Se stai accesso ai dati molto casuale, quindi la scelta della dimensione dei dati non è importante - i dati vengono caricati in pagine / linee di cache. Quindi, anche se desideri solo un byte dalla RAM, si potrebbe ottenere 32 byte trasferiti (questo è molto dipendente dalla architettura del sistema). In cima a tutto questo, la CPU / FPU potrebbe essere super-scalari (aka pipeline). Così, anche se un carico può richiedere diversi cicli, la CPU / FPU potrebbe essere occupato a fare qualcos'altro (una moltiplicazione per esempio) che nasconde il tempo di caricamento ad un grado.

  5. Lo standard non impone alcuna particolare formato per valori a virgola mobile.

Se si dispone di una specifica, poi che vi guiderà alla scelta ottimale. In caso contrario, si è scesi a sperimentare su cosa utilizzare.

Doppia è più preciso ma è codificata su 8 byte. galleggiante è solo 4 byte, così meno spazio e meno precisione.

Si dovrebbe essere molto attenti se si dispone di doppio e galleggiante nella vostra applicazione. Ho avuto un bug a causa che in passato. Una parte del codice era utilizzando float mentre il resto del codice utilizzava doppio. Copia di doppio a stare a galla e poi galleggiare di raddoppiare può causare errore di precisione che può avere grande impatto. Nel mio caso, è stata una fabbrica chimica ... speriamo che non ha avuto conseguenze drammatiche:)

Credo che sia a causa di questo tipo di bug che il razzo Ariane 6 è esploso a pochi anni fa !!!

Pensate attentamente il tipo da utilizzare per una variabile

Io personalmente vado per doppia tutto il tempo fino a quando vedo alcuni colli di bottiglia. Poi Considero passare a galleggiare o ottimizzare qualche altra parte

Questo dipende da come il compilatore implementa doppia. E 'legale per la doppia e galleggiante ad essere dello stesso tipo (ed è in alcuni sistemi).

Detto questo, se sono davvero diversi, il problema principale è la precisione. Un doppio ha una precisione molto più elevata grazie alla sua differenza di dimensioni. Se i numeri si utilizza comunemente si superi il valore di un galleggiante, quindi utilizzare un doppio.

Diverse altre persone hanno detto isssues prestazioni. Sarebbe esattamente ultimo sulla mia lista di considerazioni. Correttezza dovrebbe essere la vostra # 1 considerazione.

Credo che a prescindere dalle differenze (che come tutti fa notare, carri occupano meno spazio e sono in generale più veloce) ... qualcuno mai soffrire problemi di prestazioni con doppia? Dico uso doppia ... e se in seguito si decide "Wow, questo è molto lento" ... trovare il collo di bottiglia delle prestazioni (che non è probabilmente il fatto che hai usato doppio). Poi, se è ancora troppo lento per voi, vedere dove si può sacrificare un po 'di precisione e l'uso del galleggiante.

La differenza principale tra float e double è precisione. Wikipedia ha più informazioni singola precisione (float) e Doppia precisione .

Dipende molto dalla CPU più evidenti compromessi sono tra precisione e la memoria. Con GB di RAM, la memoria non è più un problema, quindi è generalmente meglio usare double s.

Per quanto riguarda le prestazioni, dipende fortemente sulla CPU. float s sarà solitamente ottenere prestazioni migliori rispetto <=> s su una macchina a 32 bit. Su 64 bit, <=> s sono a volte più veloce, dal momento che è (di solito) la dimensione nativa. Eppure, ciò che importa molto di più rispetto alla propria scelta di tipi di dati è se o non è possibile usufruire di istruzioni SIMD sul processore.

doppia dispone di una maggiore precisione, mentre carri occupano meno memoria e sono più veloci. In generale, si dovrebbe usare float a meno che non si dispone di un caso in cui non è sufficientemente accurata.

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