imprimiendo la parte integral de un número de punto flotante
Estoy tratando de averiguar cómo imprimir números de punto flotante sin usar las funciones de la biblioteca. La impresión de la parte decimal de un número de punto flotante resultó ser bastante fácil. Imprimir la parte integral es más difícil:
static const int base = 2;
static const char hex[] = "0123456789abcdef";
void print_integral_part(float value)
{
assert(value >= 0);
char a[129]; // worst case is 128 digits for base 2 plus NUL
char * p = a + 128;
*p = 0;
do
{
int digit = fmod(value, base);
value /= base;
assert(p > a);
*--p = hex[digit];
} while (value >= 1);
printf("%s", p);
}
Imprimiendo la parte integral deFLT_MAX
Funciona perfectamente con la base 2 y la base 16:
11111111111111111111111100000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000 (base 2)
ffffff00000000000000000000000000 (base 16)
Sin embargo, la impresión en la base 10 da como resultado errores después de los primeros 7 dígitos:
340282368002860660002286082464244022240 (my own function)
340282346638528859811704183484516925440 (printf)
Supongo que este es un resultado de la división por 10. Se mejora si uso el doble en lugar del flotador:
340282346638528986604286022844204804240 (my own function)
340282346638528859811704183484516925440 (printf)
(Si no creesprintf
entrar2^128-2^104
en Wolfram Alpha. Es correcto.)
Ahora como haceprintf
¿Consiguió imprimir el resultado correcto? ¿Utiliza algunas instalaciones bigint internamente? ¿O hay algún truco de punto flotante que me estoy perdiendo?