Для целей этого вопроса у меня нет есть возможность использовать 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
и скорректировать егов расчетах).
Но прошло уже 1039 * времени с тех пор, как я это сделал, поэтому я даже не знаю, подходит ли этот подход здесь.Кажется, так как значение каждого бита вдвое меньше, чем у предыдущего бита при перемещении через дробную часть (1/2
, 1/4
, 1/8
и т. Д.)Я действительно предпочитаю , а не , чтобы перебирать исходный код printf
, за исключением случаев, когда это абсолютно необходимо, поэтому, если кто-то может помочь с этим, я буду вечно благодарен.