La mejor opción: utilizar el formato hexadecimal C99 de punto flotante:
printf("%a", someDouble);
Cuerdas producidos de esta manera se puede convertir de nuevo en double
con la función C99 strtod()
, y también con las funciones scanf()
. Varios otros idiomas también admiten este formato. Algunos ejemplos:
decimal number %a format meaning
--------------------------------------------
2.0 0x1.0p1 1.0 * 2^1
0.75 0x1.8p-1 1.5 * 2^-1
El formato hexadecimal tiene la ventaja de que todas las representaciones son exacta. Por lo tanto, convertir la cadena nuevamente en punto flotante siempre dará el número original, incluso si alguien cambia el modo de redondeo en el que se realiza la conversión. Esto no es cierto para formatos inexactos.
Si no quiere utilizar el formato hexadecimal por cualquier razón, y está dispuesto a suponer que el modo de redondeo siempre será redondo al más cercano (el predeterminado), entonces puede salirse con la formatación de sus datos como decimales con al menos 17 dígitos significativos. Si tiene una rutina de conversión correctamente redondeada (la mayoría de las plataformas no lo hacen), esto le garantizará que puede hacer un viaje de ida y vuelta desde doble a cadena y hacia atrás sin pérdida de precisión.
Idioma importa. ¿En qué idioma estás trabajando? Es casi imposible proporcionar código sin un lenguaje específico mencionado en el problema. –
No mencioné el idioma (D) porque es comparablemente raro, así que estaba planeando reescribir un algoritmo escrito en cualquier idioma para D. –
¿Qué tal NaN, -0.0, inf, -inf? La respuesta actual no parece tener esto en cuenta. –