Это может быть ответ «вне коробки», но почему бы не преобразовать double в строку, используя sprintf, а затем проанализировать строку для мантиссы и экспоненты, преобразовать их в
например, что-то вроде:
char str[256];
long long a, b, c;
sprintf(str, "%e", dbl);
sscanf(str, "%d.%de%d", &a, &b, &c);
printf("0x%x.%xp%x", a, b, c);
Я уверен, что вам придется изменить форматы для sprintf и sscanf. И вы никогда не получите первую шестнадцатеричную цифру между А и F. Но в целом, я думаю, что эта идея должна работать. И это просто.
Лучшим способом было бы найти библиотеку с открытым исходным кодом, которая реализует этот формат для printf (например, newlib, uClibc?), И скопировать то, что они делают.