Практикум по среде и языку QBasic_____ ___________ 129

Перейдем теперь к несколько более сложному вопросу о кодировании чисел типа SINGLE, используя опыт полученный при ознакомлении с кодированием целых чисел. Исполнив в окне Immediate программу CLS:A!=0:PRINT LEN(A!),

убедимся, что число этого типа занимает 4 байта. Но разобраться в кодировании этих четырех байтов будет гораздо сложнее.

Кодирование чисел с плавающей запятой отличается от кодирования целых прежде всего тем, что ввиду ограниченного набора кодов в большинстве случаев попадающие в пределы допустимых значений действительные числа не могут быть представлены точно. И это не только иррациональные (например, корень из двух) или трансцендентные (например, число пи) числа, но и рациональные, то есть частные от деления целых чисел (например, одна пятая). В самом деле, десятичное значение этой дроби о. 2 в двоичном виде может быть представлено только бесконечной периодической дробью 0. (ООН). Так что при программировании задач, в которых необходимо использование действительных чисел нужно учитывать возможность накопления погрешностей, обусловленных неточным представлением значений исходных данных, промежуточных вычислений и результатов.

С целью уменьшения влияния погрешностей для кодирования значений числовых типов SINGLE и DOUBLE используется их представление в виде двух составляющих: порядка и мантиссы. Это обеспечивает ограничение относительной погрешности кодирования чисел с плавающей запятой. Притом относительная погрешность сравнительно медленно накапливается при операциях умножения и деления, но может резко возрасти при сложении чисел с противоположными значениями (или вычитании чисел с одинаковыми значениями). Для представления любого числа в виде порядка и мантиссы оно разбивается на два сомножителя, один из которых — положительное целое число равное целой степени основания системы счисления, а другой — правильная дробь, то есть число меньшее 1 (этот сомножитель имеет тот же знак, что и исходное число). Показатель степени одного сомножителя называется порядком, а другой сомножитель — мантиссой. Для уменьшения погрешностей мантисса не должна быть меньше чем единица деленная на основание системы счисления (так называемый случай нормализованной мантиссы).

Перейдем в окно Untitled и введем следующую программу:

DEFSNG А, С 'определение типа с плавающей запятой

DEFINT В, I, P, S 'определение целого типа

CLS 'очистка экрана

А = 0 'присвоение значения переменной

PRINT А 'вывод значения на экран

рад& = VARSEG(A) 'определение сегмента

adr& = VARPTR(A) 'определение смещения

DEFSEG = рад& 'задание сегмента для чтения из ОЗУ

80 = PEEK(adrfi) 'чтение байта О

81 = PEEK(adr& + 1) 'чтение байта 1

82 = PEEK(adr& + 2) 'чтение байта 2