Сборник по задачам и примерам Assembler

       

Ввод вещественных чисел



Ввод вещественных чисел

Теперь у нас все готово для того, чтобы выполнить ввод с клавиатуры символьного представления вещественного числа и преобразование его в соответствующий двоичный эквивалент. В уроке 19 «Архитектура и программирование сопроцессора» учебника мы обсуждали понятие вещественного числа. Отмечалось, что вещественное число имеет две формы записи — с плавающей точкой (34.89) и научную (3.45е-3=3.45х103). Для преобразования вещественного числа из символьного представления в эквивалентное двоичное можно предложить несколько способов. Самый простой — использовать возможность загрузки в сопроцессор упакованного BCD-числа. В этом случае алгоритм преобразования состоит в следующем. Символьная строка с вещественным числом вводится в память, где она преобразуется в упакованное BCD-число. При вводе указанной символьной строки запоминается положение плавающей точки. Полученное упакованное BCD-число загружается в сопроцессор, после чего оно делится на 10 в степени, соответствующей положению плавающей точки в исходном числе. Для малых чисел (в диапазоне до |1018-1|) этот способ вполне хорош. Его можно расширить, если вводить число в научном формате, при этом процесс перевода мантиссы аналогичен рассмотренному выше, но при подготовке к делению на степень 10 необходимо учесть значение степени, указанное после символа «е». Но все равно, несмотря на расширения диапазона, разряднорть мантиссы ограничена 18 цифрами. Устранить этот недостаток можно, используя операции с числами произвольной разрядности. Этот способ интересен своей универсальностью, поэтому уделим ему основное внимание.

Итак, разработаем программу ввода вещественного числа с клавиатуры в одном из двух возможных форматов — простом формате с плавающей точкой. Доработать программу для использования научного формата для вас не составит труда.

В качестве знаков, разделяющих мантиссу на целую и дробную части, можно использовать как запятую, так и точку. Суть алгоритма преобразования состоит в следующем. Производится ввод с клавиатуры символов вещественного числа. После ввода анализируются символы буфера, куда было помещены символы введенного числа, на предмет выяснения положения плавающей точки. Обнаруженная позиция запоминается. Относительно нее введенные символы делятся на символы цифр целой и дробной частей. Используя алгоритм преобразования символьного представления десятичного числа в двоичный эквивалент, преобразуется целая часть вещественного числа. Дробная часть вещественного числа также преобразуется в двоичный эквивалент. Это преобразование производится с использованием сопроцессора по формуле: ((...(u_m/b+u1_m)/b+...+u_2)/b+u.,)/b, где un — символы десятичных цифр дробной части вещественного числа u_mu1_n,..-u.2u_,, b=10. После того как данное выражение вычислено (его результат находится в вершине стека сопроцессора), производится сложение его результата с преобразованной целой частью вещественного числа. Все, теперь в вершине стека сопроцессора находится вещественное число — эквивалент своего исходного символьного представления. Текст программы преобразования вещественного числа из символьного представления достаточно велик и по этой причине приведен на дискете (prg06_05.asm). Заметьте, что с целью экономии места никаких проверок

на правильность формата вводимого вещественного числа в программе не делается.

Последнее замечание — об ограничениях на размерность исходного числа. Здесь следует различать размерности целой и дробной частей. Что касается дробной части, то здесь вообще ограничений нет, за исключением тех, которые накладывает сам сопроцессор на вводимые в его регистры значения. Для целой части узкое место — максимальная размерность операнда в команде целочисленного сложения FIADD, которая составляет 32 бита.

Ввод шестнадцатеричных и двоичных чисел мы рассматривать не будем, так как общие принципы их ввода аналогичны рассмотренным выше для десятичных чисел. Потребность в вводе с клавиатуры шестнадцатеричных и двоичных чисел возникает значительно реже, чем десятичных.

 



Содержание раздела