Я пытаюсь преобразовать двойное число в строку в собственном приложении NT, то есть в приложении, которое зависит только от ntdll.dll. К сожалению, версия vsnprintf ntdll не поддерживает %f и др., что вынуждает меня выполнять преобразование самостоятельно.
Вышеупомянутая ntdll.dll экспортирует лишь некоторые из функций math.h (floor, ceil, log, pow, ...). Однако я достаточно уверен, что при необходимости смогу реализовать любую из недоступных math.h функций.
В libc GNU есть реализация преобразования с плавающей запятой, но код чрезвычайно плотный и трудный для понимания (стиль отступа GNU здесь не помогает).
Я уже реализовал преобразование, нормализовав число (то есть умножив/делив число на 10, пока оно не окажется в интервале [1, 10)), а затем сгенерировал каждую цифру, отрезав целую часть с помощью modf и умножив дробную часть на 10. Это работает. , но есть потеря точности (правильные только первые 15 цифр). Потеря точности, конечно, присуща алгоритму.
Я бы согласился с 17 цифрами, но алгоритм, который мог бы правильно генерировать произвольное количество цифр, был бы предпочтительнее.
Не могли бы вы предложить алгоритм или указать мне хороший ресурс?
printf, который в msvc действительно дает 17 цифр, которые можно использовать для кругового обхода. gcc может дать произвольное количество цифр. 16.09.2009%fустановлена на 6, но вы можете установить точность вручную:printf("%.17f", 1.1);. 16.09.2009