<em>Невозможно нормализовать мантиссу числа, записанного в естественной
форме. Нормализация применяется для хранения чисел с плавающей запятой в
таких форматах, как IEEE754 (он же Float) или Double. Структура
разрядной сетки такого формата: [знак числа][смещенный
порядок][нормализованная мантисса со скрытой единицей]. Если твоя задача
сводится к нормализации сетки до мантиссы вида 1.ххх, это говорит о
том, что ты приводишь мантиссу к формату, пригодному именно для хранения
числа типа Float. </em> <em>Тогда в твоем примере это будет выглядеть так: </em> <em>00111001000100100000000000000000 - нули слева убираем: </em> <em>111001000100100000000000000000 - нормализуем мантиссу: </em> <em>1.11001000100100000000000000000 х 2^29. </em> <em>Теперь мантисса нормализована. </em> <em> </em> <em>Если требуется разместить Float-запись этого числа, нужно сделать так: </em> <em>1. [знак числа] - 1 бит: 0, если число положительное. </em> <em>2.
[смещенный порядок] - 8 бит: порядок числа + 127 (т.е. он никогда не
бывет отрицательным, что избавляет нас от необходимости хранить отдельно
знак порядка - в этом весь прикол формата IEEE754) </em> <em>3.
[нормализованная мантисса со скрытой единицей] - 23 бита: хранит
нормализованную мантиссу. Поскольку мантисса всегда будет начинаться с
1.ххх, единицу мы не пишем, чтобы сэкономить один разряд. </em> <em>ИТОГО: число в формате Float имеет точность 5-6 десятичных знаков и занимает 4 байта (32 бита) памяти. </em> <em> </em> <em>Итак: </em> <em>[0][10011100][11001000100100000000000], итого, мы получили число в формате Float, где: </em> <em>[10011100] = 127 + 29 = 156(10) = 10011100(2), </em> <em>а из мантиссы мы взяли только первые 23 разряда, скрыв единицу. </em> <em>В
данном случае число такое, что мы справа теряем только часть нулей,
поэтому оно перевелось в Float без потерь значащих разрядов. Будь у нас
мантисса, наподобие этой: </em> <em>1.11001000100100001000100001001 - часть
разрядов мы бы потеряли, поскольку данная мантисса просто не влезла бы
целиком в 23 разряда. </em>
begin Write('n='); ReadLn(n); if n = 0 then WriteLn('z=-1') else if (n < 0) then WriteLn('Введено отрицательное число') else begin z := 1; for i := 1 to n do z := z * 1 * (3 * i - 1); WriteLn('z=', z); end; end.