Estoy buscando una función de biblioteca para convertir números de coma flotante a cadenas, y viceversa, en C++. Las propiedades que quiero son ese str2num (num2str (x)) == x y ese num2str (str2num (x)) == x (lo más lejos posible). La propiedad general es que num2str debe representar el número racional más simple que al redondear al número de puntero flotante representable más cercano devuelve el número original.Precise punto flotante <-> conversión de cadena
Hasta ahora he intentado impulso :: 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 he tratado std :: ostringstream, que parece funcionar para la mayoría de los valores, si lo hago stream.precision (16). Sin embargo, con una precisión de 15 o 17, trunca o da resultados desagradables para cosas como 1.34. No creo que se garantice que la precisión 16 tenga propiedades particulares que requiera, y sospecho que se descompone en muchos números.
¿Hay una biblioteca C++ que tenga tal conversión? O tal función de conversión ya está enterrada en algún lugar de las bibliotecas/impulso estándar.
La razón para querer estas funciones es guardar valores de coma 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 puedan ser consumidos por humanos.
Sé que las funciones de lectura/demostración de Haskell ya tienen las propiedades que estoy buscando, al igual que las bibliotecas de BSD C. Las referencias estándar para cadena < -> doble conversiones es un par de papeles de PLDI 1990:
- Cómo leer los números de punto con precisión flotante, Will Klinger
- Cómo imprimir números de coma flotante con precisión, Guy Steele et al
Cualquier biblioteca C++/función basada en ellos sería adecuada.
EDITAR: Estoy totalmente consciente de que los números de punto flotante son representaciones inexactas de números decimales, y que 1.34 == 1.3400000000000001. Sin embargo, como los documentos de referencia sobre el punto de salida, eso no es excusa para elegir a aparecer como "1.3400000000000001"
Edit2: Este documento explica exactamente lo que estoy buscando: http://drj11.wordpress.com/2007/07/03/python-poor-printing-of-floating-point/
Cuando busqué uno, encontré uno en C, no en C++. No tengo el enlace aquí. Me parece recordar que estaba en el sitio ftp de NAG, pero podría estar equivocado. – AProgrammer
Una biblioteca de C es igualmente buena: ahora solo estoy revisando los documentos de NAG. –
Puede buscar GMP y MPFR para la emulación de coma flotante de software. Pero lo que estás pidiendo es casi imposible con los tipos 'float' y' double' de C++. – greyfade