Как преобразовать двойное число в строку без использования CRT

Мой вопрос не имеет практического применения. Мне просто интересно. Допустим, у меня есть значение типа double и я хочу получить его строковое представление аналогично функции printf. Как бы я сделал это без библиотеки времени выполнения C? Предположим, у меня архитектура x86.


person Kerido    schedule 07.03.2010    source источник
comment
Это во многом зависит от количества неточностей, которые вы готовы терпеть. Один из моих (без ответа) вопросов может быть полезен: stackoverflow.com/questions/1434511/   -  person avakar    schedule 07.03.2010
comment
Да, очень-очень похож. Вы нашли решение?   -  person Kerido    schedule 07.03.2010
comment
У меня есть ответ, который ссылается на две статьи. Оба, однако, требуют целочисленной арифметики произвольной точности. Насколько мне известно, нет другого способа восстановить все 17 цифр (но хотелось бы, чтобы меня опровергли).   -  person avakar    schedule 07.03.2010
comment
Верно, никакого практического применения, зевок. Почему бы вам не начать CodeGolf?   -  person Hans Passant    schedule 07.03.2010
comment
nobugz, возможно, это не имеет практического применения для ОП и для вас, но когда-то имело для меня.   -  person avakar    schedule 07.03.2010
comment
Я наткнулся на этот вопрос, потому что мне было любопытно увидеть решение вопроса, как я его интерпретировал: как преобразовать двойное число в строку без использования электронно-лучевой трубки. :-)   -  person    schedule 08.03.2010


Ответы (3)


Учитывая, что вы заявляете, что ваш вопрос не имеет практического применения, я полагаю, вы пытаетесь узнать о представлениях чисел с плавающей запятой.

Таким образом, если вы ищете решение без поддержки какой-либо библиотеки, начните с спецификация формата. Из этого вы можете различить различные «специальные» значения (бесконечность, NAN и т. д.), а также расшифровать/вычислить фактическое числовое значение. Когда у вас есть значение и показатель степени, вы знаете, где ставить десятичную точку. Вам придется написать собственную процедуру типа itoa. Для корней, которые являются степенью двойки, это может быть так же просто, как таблица поиска. Для десятичных чисел вам придется немного посчитать.

person nall    schedule 07.03.2010

вы можете получить все значения слева (двойной % 10), а затем каждый раз делить на 10. они будут справа налево.

чтобы получить значения справа от точки, вы должны умножить на 10, а затем (двойной % 10). они будут слева направо.

person fazo    schedule 07.03.2010
comment
Исходя из своего опыта, могу сказать, что правильно вы угадаете только около 13 цифр (из 17). - person avakar; 07.03.2010

Если вы хотите сделать это просто с "достаточно близким" результатом, см. мою статью http://www.exploringbinary.com/quick-and-dirty-floating-point-to-decimal-conversion/ . В нем описывается простая программа, которая использует числа с плавающей запятой для преобразования из числа с плавающей запятой в десятичное число, и объясняется, почему этот подход никогда не может быть точным для всех преобразований. (Программа не выполняет десятичное округление, как printf, но это должно быть достаточно легко добавить.)

person Rick Regan    schedule 12.11.2010