Как распечатать Номер IEEE754 (без printf)?

Для целей этого вопроса я не имею возможность использовать средства printf (к сожалению, я не могу сказать вам почему, но пока предположим, что я знаю, что делаю).

Для числа с одинарной точностью IEEE754 у вас есть следующие биты:

SEEE EEEE EFFF FFFF FFFF FFFF FFFF FFFF

где S - знак, E - показатель степени, а F - дробь.

Распечатать знак относительно просто для всех случаев, как и для всех особых случаев, таких как NaN ( E == 0xff, F! = 0 ), Inf ( E == 0xff, F == 0 ) и 0 ( E == 0, F == 0 , считается особенным только потому, что в этом случае не используется смещение экспоненты).

У меня два вопроса.

Первый: как лучше всего преобразовать денормализованные числа (где E == 0, F! = 0 ) в нормализованные числа (где 1 <= E < = 0xfe )? Я подозреваю, что это будет необходимо для упрощения ответа на следующий вопрос (но я могу ошибаться, поэтому не стесняйтесь обучать меня).

Второй вопрос - как распечатать нормализованные числа. Я хочу иметь возможность распечатать их двумя способами: экспоненциальным, например -3.74195E3 , и неэкспоненциальным, например 3741.95 . Хотя, просто глядя на эти два рядом, должно быть довольно легко превратить первое во второе, просто перемещая десятичную точку. Так что давайте просто сконцентрируемся на экспоненциальной форме.

Я смутно помню алгоритм, который я давно использовал для печати PI, где вы использовали одну из постоянно сокращающихся формул и сохраняли верхний и нижний предел возможностей, выводя цифру, когда оба предела согласованы, и сдвиг вычисления в 10 раз (поэтому, когда верхний и нижний пределы были 3,2364 и 3,1234 , вы могли бы вывести 3 и поправьте это в расчетах).

Но это было долгое время с тех пор, как я сделал это, поэтому я даже не знаю, подходит ли такой подход здесь. Кажется так, поскольку значение каждого бита вдвое меньше, чем у предыдущего бита при перемещении по дробной части ( 1/2 , 1/4 , 1/8 и так далее).

Я бы предпочел , а не , тащиться через исходный код printf без крайней необходимости, поэтому, если кто-нибудь может помочь с этим, я буду бесконечно благодарен.

5
задан paxdiablo 25 November 2010 в 08:16
поделиться