Точно. Давненько я туда не заглядывал. Работает, да и ладно :-)
Когда-то давно-давно, до avr-libc 1.6, как я сейчас выяснил, было
Код
#define FLTBUFLEN 40
...
#if PRINTF_LEVEL >= PRINTF_FLT
int8_t decpt;
char fb[FLTBUFLEN]; /* floating point buffer */
#endif
остатки от форматтера, который и double умел.
Сейчас они 1) жёстко урезали до float с максимум 7 значащими цифрами и написанная на ассемблере
__ftoa_engine в тот 11-байтовый буфер складывает флаги результата преобразования (в т.ч. NAN) и преобраованную мантиссу, а порядок возвращает в
vfprintf как число, которое там уже выводится отдельно. Итого к стеку в самом vfprintf добавляется адрес возврата при вызове __ftoa_engine и шесть байтов для сохраняемых в ней регистров. Очень хорошо (то-то я как пример 4-debug написал, так удивился, что отладочній процесс с printf-ом ест меньше стека, чем яожидал :-) ).