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 creesprintfentrar2^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?

Respuestas a la pregunta(7)

Su respuesta a la pregunta