Для целей этого вопроса я не имею возможность использовать средства 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
без крайней необходимости, поэтому, если кто-нибудь может помочь с этим, я буду бесконечно благодарен.