Я пытаюсь преобразовать двойное число в строку в собственном приложении 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