печать неотъемлемой части числа с плавающей точкой

Я пытаюсь выяснить, как печатать числа с плавающей запятой без использования библиотечных функций. Печать десятичной части числа с плавающей запятой оказалась довольно простой. Печать неотъемлемой части сложнее:

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);
}

Печать неотъемлемой частиFLT_MAX работает безупречно с базой 2 и базой 16:

11111111111111111111111100000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000 (base 2)

ffffff00000000000000000000000000 (base 16)

Однако печать в базе 10 приводит к ошибкам после первых 7 цифр:

340282368002860660002286082464244022240 (my own function)
340282346638528859811704183484516925440 (printf)

Я предполагаю, что это результат деления на 10. Будет лучше, если я использую double вместо float:

340282346638528986604286022844204804240 (my own function)
340282346638528859811704183484516925440 (printf)

(Если вы не веритеprintf, войти2^128-2^104 в Wolfram Alpha. Это правильно.)

Теперь, как этоprintf удалось напечатать правильный результат? Использует ли он некоторые средства bigint внутри? Или я пропускаю какой-то трюк с плавающей запятой?

Ответы на вопрос(7)

Ваш ответ на вопрос