2015-09-06 14 views
5

più numeri decimali a virgola fissa vengono mappati sullo stesso doppio valore. Ad esempio:Conversione C/C++ da doppio a punto fisso con numero minimo di cifre diverse da zero

double d1 = 132.24; 
double d2 = 132.24000000000001; 

d1 e d2 hanno lo stesso valore binario.

Quando si converte d1 (o d2, hanno lo stesso valore) in stringa usando ostream con 14 cifre di precisione, viene convertito in: 132.24000000000001.

C'è un modo/libreria che supporta la conversione da double-> string, dove la stringa è il valore a virgola fissa con un numero minimo di cifre diverse da zero e che è una conversione valida? cioè in questo caso la conversione d1 una stringa tornerà 132,24 mille miliardi (mostrato con 14 cifre di precisione)

+7

Questo problema preciso è stato oggetto degli algoritmi ["Dragon4" e "Grisu3"] (http://www.serpentine.com/blog/2011/06/29/here-be-dragons-advances-in- problemi-si-non ha ancora-even-know-you-avevi /). È più o meno risolto, anche se i miglioramenti sono ancora possibili. –

+2

Ecco come funziona il floating point! Si veda [La matematica in virgola mobile è rotta?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

+0

il tipo float/double di variabili non può rappresentare esattamente alcuni/molti valori. La tua domanda capita semplicemente di colpire uno di quei tanti valori. – user3629249

risposta

2

La biblioteca https://github.com/floitschG/double-conversion fornisce il metodo DoubleToStringConverter :: DoubleToAscii con l'opzione BREVE: "BREVE: produrre la minor quantità di cifre per che il requisito dell'identità interna è ancora soddisfatto. "

Grazie mille per l'esperienza inesistente che mi sta indicando la giusta direzione.

Problemi correlati