2012-08-23 16 views
5

Sto sviluppando un'applicazione C++ che gira su ambiente Linux. Ho bisogno di memorizzare un valore elevato con 6 posizioni declaml. Ho usato un doppio per quello. Ma dopo l'assegnazione, la doppia variabile non contiene il valore esatto. Ha completato.Perdita di precisione con doppio C++

Es:

double dValue = 79447461534242.913072; //Assignement of value 

Ma dopo, quando vedo il valore in dValue è qualcosa di simile 79447461534242,906

Qualcuno può farmi sapere perché questo sta accadendo e mi suggeriscono il tipo di dati corretto che può contenere il valore esatto senza perdere la precisione.

+2

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –

+0

Non dimenticare di accettare la risposta preferita;) –

risposta

5

In un'implementazione tipica, un double ha circa 15 cifre di precisione totale. Non importa molto se questi sono prima o dopo il punto decimale, è solo un totale di 15 cifre.

Nel tuo caso, il numero originale è di circa 20 cifre, quindi cinque vengono persi immediatamente.

+0

Sei sicuro della precisione di 15 cifre in * totale *? Almeno in Javascript la precisione dei numeri interi è accurata ... Ma non sono sicuro che sia qualcosa di unico per Javascript. –

+1

@MarcusRiemer: i tipi interi sono precisi anche in C++; ma questa domanda riguarda i tipi a virgola mobile. –

+0

@MarcusRiemer: 'double' e intero sono due tipi di animali completamente diversi. Mentre i linguaggi di "alto livello" spesso supportano interi di precisione arbitrari, il C++ viene solitamente implementato con ciò che fornisce l'hardware, in genere 16 bit in breve, 32 per int, 32 o 64 bit per lungo e 64 per lungo. 'double' è normalmente un tipo a virgola mobile a 64 bit con una mantissa a 53 bit. –

5

C++ utilizza i tipi di virgola mobile IEEE che sono solo precisi in una certa misura dal modello. Se hai bisogno della precisione arbitaria, dai un'occhiata ad esempio GNU MP Bignum o qualsiasi altra libreria di precisione arbitary.

2

Il numero most commonly used double precision format memorizza il numero con 53 bit di precisione. Questo dà approssimativamente 16 cifre decimali di precisione.

Potreste scoprire che long double fornisce maggiore precisione, ma non è garantito che sia superiore a double.

Se è necessaria una precisione maggiore rispetto a quella ottenuta dai tipi di macchina nativi, è necessaria una libreria numerica ad alta precisione, ad esempio GMP.

1

Su linux è possibile utilizzare __float128 che è un quadruplo tipo a virgola mobile di precisione.

+0

A condizione che tu abbia gcc> 4.6 –

+0

Non riuscivo a compilarlo con __float28.Dà l'errore '__float128' non è stato dichiarato in questo ambito – user1308004

+0

Quale versione stai usando di gcc? Scrivi 'gcc --version' –

Problemi correlati