Conversión precisa de cadena flotante <->

Estoy buscando una función de biblioteca para convertir números de punto flotante en cadenas, y viceversa, en C ++. Las propiedades que quiero son que str2num (num2str (x)) == x y that num2str (str2num (x)) == x (en la medida de lo posible). La propiedad general es que num2str debe representar el número racional más simple que cuando se redondea al número de puntero flotante representable más cercano le devuelve el número original.

Hasta ahora he intentado boost :: lexical_cast:

double d = 1.34;
string_t s = boost::lexical_cast<string_t>(d);
printf("%s\n", s.c_str());
// outputs 1.3400000000000001

Y probé std :: ostringstream, que parece funcionar para la mayoría de los valores si hago stream.precision (16). Sin embargo, con una precisión de 15 o 17, trunca o da un resultado feo para cosas como 1.34. No creo que la precisión 16 tenga la garantía de tener alguna propiedad en particular que yo requiera, y sospecho que se descompone en muchos números.

¿Hay una biblioteca de C ++ que tenga tal conversión? O tal función de conversión ya está oculta en algún lugar de las bibliotecas estándar / boost.

La razón para querer estas funciones es guardar valores de punto flotante en archivos CSV y luego leerlos correctamente. Además, me gustaría que los archivos CSV contengan números simples en la medida de lo posible para que los humanos puedan consumirlos.

Sé que las funciones de lectura / presentación de Haskell ya tienen las propiedades que busco, al igual que las bibliotecas BSD C. Las referencias estándar para las conversiones dobles de cadena <-> son un par de documentos de PLDI 1990:

Cómo leer los números de punto flotante con precisión, Will KlingerCómo imprimir números de punto flotante con precisión, Guy Steele et al.

Cualquier biblioteca / función de C ++ basada en estas sería adecuada.

EDITAR: Soy plenamente consciente de que los números de punto flotante son representaciones inexactas de los números decimales, y que 1.34 == 1.3400000000000001. Sin embargo, como señalan los documentos mencionados anteriormente, no es una excusa para elegir mostrarse como "1.340000000000001"

EDIT2: Este artículo explica exactamente lo que estoy buscando:http://drj11.wordpress.com/2007/07/03/python-poor-printing-of-floating-point/

Respuestas a la pregunta(5)

Su respuesta a la pregunta