Чем отличается компьютерная арифметика от обычной почему
Понятия и определения компьютерной арифметики. Классификация систем счисления и их выбор для использования в компьютерной системе (КС). Выполнение арифметических операций в КС над двоичными числами с фиксированной точкой и над числами с плавающей точкой.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | учебное пособие |
Язык | русский |
Дата добавления | 08.12.2015 |
Размер файла | 966,0 K |
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Рисунок 2.28 - Перевод из десятичной системы счисления в двоичную систему счисления неправильной дроби А = 23.125(10).
Таким образом, получаем: 23.125(10) - 10111.001(2).
Для перевода восьмеричного (шестнадцатеричного) числа в двоичное необходимо каждую цифру исходного числа записать в виде эквивалентного ей трехбитного (четырехбитного) двоичного числа.
Например: необходимо перевести из восьмеричной системы счисления в двоичную систему счисления неправильную дробь А = 273.5(8).
Решение: исходя из вышесказанного разобьем каждую цифру неправильной восьмеричной дроби на триады и переведем каждую цифру отдельно:
Например: необходимо перевести из шестнадцатеричной системы счисления в двоичную систему счисления неправильную дробь А = 5АЕ.18(16).
Решение: исходя из вышесказанного разобьем каждую цифру неправильной шестнадцатеричной дроби на тетрады и переведем каждую цифру отдельно:
Все рассмотренные алгоритмы предназначены для программного перевода чисел. Известно также множество алгоритмов перевода, ориентированных на реализацию их аппаратными средствами. Однако изучать такие алгоритмы целесообразно вместе с изучением компьютерных аппаратных средств.
3. Представление числовых данных в компьютерных системах
компьютерный арифметика счисление двоичный
Система вещественных чисел, используемая в ручных расчетах, предполагается бесконечной и непрерывной, т.е. отсутствуют ограничения на диапазон используемых чисел и точность (количество значащих цифр).
Пояснение: для любого вещественного числа существует бесконечно много чисел, которые больше или меньше его, и между любыми двумя вещественными числами находится также бесконечно много чисел.
В компьютерной технике размеры устройств ограничены. Эти ограничения касаются диапазона чисел и точности их представления. Поэтому система машинных чисел является конечной и дискретной, образуя подмножество системы вещественных чисел.
На рис. 3.1 схематически представлена система машинных чисел где (Xmax) и (Xmin) - соответственно максимально и минимально представимые числа, между которыми находится конечное множество допустимых чисел.
Рисунок 3.1 - Система машинных чисел
Если результат операции по модулю превышает |Xmax|, то возникает переполнение (overflow). Если модуль результата |X|<|Xmin|, фиксируется антипереполнение (underflow). В этом случае большинство компьютеров возвращают в качестве результата операции (0). Поэтому область чисел от
(-Xmin до Xmin), за исключением истинного нуля, называют машинным нулем. В современных универсальных компьютерных системах преимущественно используют две формы представления чисел:
- с фиксированной запятой (фиксированной точкой - fixed point) - естественная форма;
- с плавающей запятой ( плавающей точкой - floating point) - альтернативные названия - нормальная, экспоненциальная, научная запись или полулогарифмическая.
Например, пусть задано число:
где: Х - некоторое число;
- цифры слева от запятой;
- цифры справа от запятой.
В позиционной системе счисления с основанием (2) его можно записать в виде:
где: Х - некоторое число;
2 - основание системы счисления;
Если каждому числу (X) в компьютерной системе однозначно соответствует мантисса (M), а порядок (Р) фиксирован для всех чисел, то число (X) представлено в форме с фиксированной запятой. Порядок (Р) в этом случае устанавливается заранее при подготовке задачи к решению, причем число (2 -P ), по существу, является масштабным коэффициентом, на который необходимо умножить исходные данные для того, чтобы избежать переполнения разрядной сетки.
Естественная форма характеризуется тем, что положение разрядов (и запятой) в машинном представлении чисел остается всегда постоянным независимо от величин чисел, с которыми оперирует компьютерная система. С целью упрощения процедуры определения масштабных коэффициентов запятую обычно фиксируют перед старшим разрядом мантиссы или после ее младшего разряда.
В первом случае компьютерная система оперирует с числами, которые по абсолютной величине меньше единицы, то есть, с правильными дробями. Если количество разрядов для представления мантиссы равно (n), то: (|Xmin|=2 -n , |Xmax|=1-2 -n ).
Во втором случае компьютерная система выполняет операции с целыми числами, абсолютные величины которых находятся в пределах от (1 (минимального, не равного нулю числа) до 2 n -1).
Если каждому числу (X) однозначно соответствует пара (М) и (Р), то такое представление называют формой с плавающей запятой. Следует иметь в виду, что положение запятой в реальной разрядной сетке компьютерной системы физически никак не указывается, а только «подразумевается» и само число можно записать в виде:
где: Х - некоторое число;
М - мантисса числа (Х);
Е - разделитель мантиссы и порядка числа (Х);
Р - порядок числа (Х).
Для однозначного представления числа в нормальной форме принято, что мантисса должна удовлетворять условию:
то есть мантисса должна быть правильной дробью, а ее старшая цифра -- отличной от (0). В таком случае представление числа является нормализованным. Помимо однозначного представления, это дает еще и сохранение максимального количества значащих цифр мантиссы при выполнении операций. Положение разрядов числа в форме с плавающей запятой не является постоянным, то есть запятая как бы плавает.
С учетом рассмотренных ранее структурных единиц информации, различают несколько форматов данных с фиксированной запятой. Например, в компьютерах IBM PC AT машинное слово имеет длину 16 бит (2 байта).
Используются следующие форматы: слово, полуслово (байт), двойное слово (doubleword), учетверенное слово (quadword).
В соответствии с перечисленными форматами различают базовые типы целочисленных данных:
- целое слово - 16 бит;
- короткое целое слово - 32 бит;
- длинное целое слово - 64 бит.
Для того, чтобы компьютерная система могла оперировать как положительными, так и отрицательными числами, в разрядную сетку машинного представления числа необходимо ввести знаковую часть.
В двоичной системе счисления принято знак положительного числа обозначать «0», а знак отрицательного числа - «1» (обычно это крайний левый бит в представлении числа), как показано на рис.3.2.
Рисунок 3.2 - Формат числа в двоичной системе счисления со знаковым битом
Будем обозначать целые знаковые числа в виде:
а правильные дроби:
В связи с тем, что алгоритмы выполнения операций в компьютерных системах имеют свою специфику, возникает проблема представления отрицательных чисел.
Ее решают за счет использования особых способов кодирования числовых данных.
Рассмотрим три наиболее распространенных кода, которые применяются на практике: - прямой код; - обратный код; - дополнительный код.
Прямой код используется для представления отрицательных чисел в запоминающем устройстве компьютерной системы, а также при умножении и делении.
Обратный и дополнительный коды используются для замены операции вычитания операцией сложения, что упрощает устройство арифметического блока компьютерной системы.
К кодам выдвигаются следующие требования:
- разряды числа в коде жестко связаны с определенной разрядной сеткой;
- для записи кода знака в разрядной сетке отводится фиксированный, строго определенный разряд.
1. Прямой код. Наиболее естественный код. Формируется следующим образом: в знаковый бит (SX) числа помещают знак числа (0 - если число положительное и 1 - если число отрицательное ), а остальные биты используют для абсолютного значения (модуля) числа. Правило преобразования чисел в прямом коде можно записать так:
где A - вес старшего разряда в n-разрядной сетке, A=2 s -1 .
Отображение s-битных наборов ( прямой код верхняя числовая прямая) на числовую ось ( числа нижняя числовая прямая ) для компьютерной системы показано на рис. 3.3
Рисунок 3.3- Отображение s-битных наборов (прямой код) на числовую ось
Диапазон представимых чисел: -(2 s -1 -1)…(2 s -1).
Положительный момент заключается в удобстве операции ввода-вывода данных. Отрицательный момент в том, что существует два представления (0) и операция алгебраического сложения требует анализа знаков и модулей операндов, и выбора фактической операции сложения или вычитания.
2. Обратный код. Обратный (n - разрядный) двоичный код положительного целого числа состоит из одноразрядного кода знака (0), за которым следует ( n - 1) разрядное двоичное представление модуля числа, то есть обратный код для положительного числа совпадает с прямым кодом.
Обратный ( n - разрядный ) двоичный код отрицательного целого числа состоит из одноразрядного кода знака (1), за которым следует ( n - 1) разрядное двоичное число, представляющее собой инвертированное (n - 1) разрядное представление модуля числа, то есть для отрицательного числа все цифры числа заменяются на противоположные, а именно ( 1 на 0, а 0 на 1) и в знаковый разряд заносится единица.
Обратный код числа определяется соотношением:
где B=2 s -1=Xmax - максимальное число в n-разрядной сетке.
Отображение s-битных наборов ( обратный код верхняя числовая прямая) на числовую ось ( числа нижняя числовая прямая ) для компьютерной системы показано на рис. 3.4.
Рисунок 3.4 - Отображение s-битных наборов (обратный код ) на числовую ось
Диапазон представимых чисел: -(2 s-1 -1)…(2 s -1).
Положительный момент заключается в том, что при сложении обратных кодов чисел как беззнаковых чисел получаем обратный код суммы.
Отрицательный момент заключается в том, что существует два представления (0) и при выполнении операций сложения в обратном коде требуется коррекция суммы с помощью циклического переноса единицы переполнения из знаковых разрядов суммы.
3. Дополнительный код. Наиболее распространенный способ представления отрицательных целых чисел в компьютерных системах.
Он позволяет заменить операцию вычитания на операцию сложения, чем упрощает архитектуру компьютерной системы.
Дополнительный код является дополнением числа до некоторого граничного числа (|Xmax+1|=2 s ).
Дополнительный код положительного числа совпадает с прямым кодом.
Для получения дополнительного кода отрицательного числа существует три способа:
- все цифры модуля исходного числа заменяются на взаимно обратные, то есть производится инверсия всех цифр числа, затем к полученному значению добавляется единица в младшем разряде;
- из модуля числа вычитается (1) младший бит, а затем инвертируются все разряды;
- необходимо записать n-битный модуль числа. Затем просматривать число справа налево, сохранить все младшие нули и первую встретившуюся (1), а остальные биты инвертировать.
Дополнительный код числа определяется соотношением:
где - , C = Xгр. равняется весу не существующего в данном числе разряда, расположенного слева от знаковой цифры.
Отображение s-битных наборов ( дополнительный код верхняя числовая прямая) на числовую ось ( числа нижняя числовая прямая ) для компьютерной системы показано на рис. 3.5.
Рисунок 3.5 - Отображение s-битных наборов (дополнительный код ) на числовую ось
Диапазон представимых чисел: -(2 s-1 )…(2 s -1).
Свойства дополнительного кода:
- при сложении чисел в дополнительном коде как беззнаковых чисел получаем дополнительный код суммы. Знаковые биты суммируются обычным образом, а возникающий при их сложении перенос игнорируется.
- любое число в дополнительном коде можно считать младшими битами («хвостом») числа любой длины, если содержимое знакового бита копировать влево. Эта операция называется расширением знака. Используется, когда исходные операнды в операциях сложения и вычитания имеют разную длину.
1. Операции должны выполняться над данными, представленными в одном и том же коде: ПК-ПК, ОК-ОК, ДК-ДК;
2. Положительные числа в ПК, ОК, ДК не меняют своего представления;
3. Результат выполнения операций сложения и вычитания над числами, представленными в ПК, ОК или ДК, являются ПК, ОК или ДК соответственно;
4. Двоичный набор, представляющий (-0) в ПК и ДК, является запрещенной комбинацией;
5. В отличие от ПК, в ОК и ДК нельзя отбрасывать нули после знакового разряда в целой части и нули в конце дробной части отрицательного числа (разрешается отбрасывать 1).
3.1 Арифметические флажки
Флажки являются признаками, представляющими общую характеристику результата выполнения операции. Наиболее широко применяются следующие флажки:
- флажок переноса (Flag Carry), обозначаемый (FC). Устанавливается в (1) в двух случаях:
1. Если при выполнении операции сложения имеет место перенос из старшего бита результата (представляет собой расширение результата на 1 бит влево);
2. Если при выполнении операции вычитания имеет место заем (borrow) в старший бит. Это возможно в случае, если уменьшаемое меньше вычитаемого. Если операнды интерпретируются как беззнаковые числа, данный флажок является признаком переполнения компьютерной системы.
В операциях над знаковыми числами самостоятельного значения не имеет.
- флажок вспомогательного переноса или дополнительный перенос (Flag Auxiliary), обозначаемый (FA). При сложении показывает перенос, а при вычитании - заем из младшей тетрады (бит 3) результата. Используется в операциях двоично-десятичной арифметики.
- флажок нуля (Flag Zero), обозначаемый (FZ). Признак нулевого результата. Устанавливается в (1) когда результат выполнения операции равняется (0).
- флажок знака (Flag Sign), обозначаемый (FS). Повторяет состояние знакового бита.
- флажок переполнения (Flag Overflow), обозначаемый (FО).
В операциях над знаковыми числами показывает, находится ли результат внутри диапазона представимых чисел:
- (FO) = 0 - результат правильный;
- (FO) = 1 - возникло переполнение. Следует отметить, что (FO) устанавливается в (1), если перенос в старший разряд и из него не совпадают.
3.2 Контроль переполнения в компьютерных системах
Возможно только при сложении чисел с одинаковыми знаками, когда для представления результата недостаточно отведенного количество разрядов (требуется больше, чем для представления операндов). Это может приводить не только к неправильному (по абсолютной величине) результату, но и к неправильному его знаку. Независимо от кода для представления отрицательных чисел (обратный или дополнительный) переполнение разрядной сетки имеет место всегда, если только при сложении положительных чисел возникает перенос в знаковый разряд, а при сложении отрицательных чисел такой перенос равен нулю. Введение масштабных коэффициентов, на которые необходимо умножить все исходные данные перед решением задачи, позволяет предотвратить переполнение. В компьютерных системах предусматривают специальные средства для обнаружения переполнения разрядной сетки:
- программный способ; основан на том, что при сложении чисел с одинаковыми знаками знак суммы должен совпадать со знаками операндов;
- аппаратный способ; основан на использовании модифицированных кодов.
При использовании модифицированных кодов знак числа изображается двумя одинаковыми цифрами. Эти цифры в процессе выполнения операций обрабатываются так же, как и числовые разряды. При этом появление в знаковых разрядах разных цифр (01 при сложении положительных и 10 при сложении отрицательных двоичных операндов) свидетельствует о переполнении разрядной сетки.
Модифицированный код позволяет формировать правильный знак результата даже при наличии переполнения.
Этот знак сохраняется во втором (старшем) знаковом разряде. Такой способ обнаружения переполнения разрядной сетки наиболее распространен в компьютерных системах, несмотря на некоторую избыточность в аппаратных средствах для представления чисел, поскольку позволяет оперативно (то есть, одновременно с результатом) получить информацию о переполнении.
На рис.3.6 представлен формат двоичного знакового числа с использованием модифицированного кода.
Рисунок 3.6 - Формат двоичного знакового числа с использованием модифицированного кода.
При выполнении операций сложения и вычитания чисел в дополнительных кодах обрабатывающее устройство компьютера не делает различий между знаковыми и беззнаковыми операндами.
То есть операнды должны интерпретироваться самим пользователем как знаковые или беззнаковые. В операции вычитания используется дополнительный код вычитаемого. Если длина операндов превышает длину машинного слова, то сложение и вычитание выполняют в несколько приемов, организуя программный цикл.
Операцию начинают с младших частей операндов, «продвигаясь» далее в сторону старших частей. На каждом шаге должны обрабатываться возникающие переносы (или заемы).
4. Выполнение арифметических операций в компьютерных системах над двоичными числами с фиксированной точкой
4.1 Операция сложения и вычитания, двоичных беззнаковых чисел в компьютерных системах
Компьютерная система выполняет сложение и вычитание операндов по правилам сложения и вычитания двоичных беззнаковых чисел рис.4.1:
Вопрос по информатике:
Чем отличается компьютерная арифметика от обычной? Примеры
Трудности с пониманием предмета? Готовишься к экзаменам, ОГЭ или ЕГЭ?
Воспользуйся формой подбора репетитора и занимайся онлайн. Пробный урок - бесплатно!
- 16.09.2018 20:59
- Информатика
- remove_red_eye 4879
- thumb_up 43
Ответы и объяснения 1
Если речь о результатах, то в компьютерной арифметике числа представляются в двоичном коде, а точность их представления обычно ограничена разрядностью процессора. Для проведения расчетов с неограниченной точностью используются специальные алгоритмы с представлением чисел в виде символьных строк.
При использовании двоичной арифметики приходится сталкиваться с тем, что большинство нецелых чисел невозможно точно представить в двоичной системе, как нельзя, например, в десятичной системе точно представить в виде десятичной дроби число 1/3 = 0.333.
Рассмотрим пример. Если в простых дробях (1/3) х 3 = 1, то в десятичных 0.3333 х 3 = 0.9999.
В двоичной машинной арифметике происходит аналогичная ситуация. Но если человек сознает, что результат 0.9999. - та же единица, то компьютер этого не понимает. В результате в компьютерной арифметике (1 / 3) х 3 не равняется единице.
Еще пример. Пусть нам надо вычислить значение функции в точках от -2π до 2π с шагом π/6. Человек будет использовать значения -2π, -11π/6, -10π/6 и т.д. пока не придет к точке 2π. Компьютер (в арифметике с обычной точностью) вычислит значение -2π как -6.283185, а шаг представит значением 0.5235988. Это приведет к тому, что когда мы придем к нулю, то получим значение аргумента -9.536743х10⁻⁷, а в конечной точке получим аргумент 6.283184, который по абсолютной величине отличается от начального на единицу в младшей цифре, т.е. для компьютера при таком последовательном счете |-2π| ≠ 2π.
Третий пример. отрицательные целые числа представляются в компьютере в дополнительном коде, когда старший разряд является знаковым: 0 - это плюс, 1 - это минус.
Пусть мы прибавляем к 127 единицу в арифметике целых чисел, которым в двоичном представлении отведен один байт:
1111111₂ + 1₂ = 10000000₂ - тут все понятно, единичка перешла в старший, восьмой разряд. Но ведь он ЗНАКОВЫЙ! И вместо двоичного эквивалента 128 в компьютерной арифметике мы получаем отрицательное число! Причем, что самое интересное, из соображений эффективности эта ситуация обычно аппаратно не контролируется и в результате программы могут вести себя очень странно.
Знаете ответ? Поделитесь им!
Как написать хороший ответ?
Чтобы добавить хороший ответ необходимо:
- Отвечать достоверно на те вопросы, на которые знаете правильный ответ;
- Писать подробно, чтобы ответ был исчерпывающий и не побуждал на дополнительные вопросы к нему;
- Писать без грамматических, орфографических и пунктуационных ошибок.
Этого делать не стоит:
- Копировать ответы со сторонних ресурсов. Хорошо ценятся уникальные и личные объяснения;
- Отвечать не по сути: «Подумай сам(а)», «Легкотня», «Не знаю» и так далее;
- Использовать мат - это неуважительно по отношению к пользователям;
- Писать в ВЕРХНЕМ РЕГИСТРЕ.
Есть сомнения?
Не нашли подходящего ответа на вопрос или ответ отсутствует? Воспользуйтесь поиском по сайту, чтобы найти все ответы на похожие вопросы в разделе Информатика.
Трудности с домашними заданиями? Не стесняйтесь попросить о помощи - смело задавайте вопросы!
Информатика — наука о методах и процессах сбора, хранения, обработки, передачи, анализа и оценки информации с применением компьютерных технологий, обеспечивающих возможность её использования для принятия решений.
Если речь о результатах, то в компьютерной арифметике числа представляются в двоичном коде, а точность их представления обычно ограничена разрядностью процессора. Для проведения расчетов с неограниченной точностью используются специальные алгоритмы с представлением чисел в виде символьных строк.
При использовании двоичной арифметики приходится сталкиваться с тем, что большинство нецелых чисел невозможно точно представить в двоичной системе, как нельзя, например, в десятичной системе точно представить в виде десятичной дроби число 1/3 = 0.333.
Рассмотрим пример. Если в простых дробях (1/3) х 3 = 1, то в десятичных 0.3333 х 3 = 0.9999.
В двоичной машинной арифметике происходит аналогичная ситуация. Но если человек сознает, что результат 0.9999. - та же единица, то компьютер этого не понимает. В результате в компьютерной арифметике (1 / 3) х 3 не равняется единице.
Еще пример. Пусть нам надо вычислить значение функции в точках от -2π до 2π с шагом π/6. Человек будет использовать значения -2π, -11π/6, -10π/6 и т.д. пока не придет к точке 2π. Компьютер (в арифметике с обычной точностью) вычислит значение -2π как -6.283185, а шаг представит значением 0.5235988. Это приведет к тому, что когда мы придем к нулю, то получим значение аргумента -9.536743х10⁻⁷, а в конечной точке получим аргумент 6.283184, который по абсолютной величине отличается от начального на единицу в младшей цифре, т.е. для компьютера при таком последовательном счете |-2π| ≠ 2π.
Третий пример. отрицательные целые числа представляются в компьютере в дополнительном коде, когда старший разряд является знаковым: 0 - это плюс, 1 - это минус.
Пусть мы прибавляем к 127 единицу в арифметике целых чисел, которым в двоичном представлении отведен один байт:
1111111₂ + 1₂ = 10000000₂ - тут все понятно, единичка перешла в старший, восьмой разряд. Но ведь он ЗНАКОВЫЙ! И вместо двоичного эквивалента 128 в компьютерной арифметике мы получаем отрицательное число! Причем, что самое интересное, из соображений эффективности эта ситуация обычно аппаратно не контролируется и в результате программы могут вести себя очень странно.
Если речь о результатах, то в компьютерной арифметике числа представляются в двоичном коде, а точность их представления обычно ограничена разрядностью процессора. Для проведения расчетов с неограниченной точностью используются специальные алгоритмы с представлением чисел в виде символьных строк.
При использовании двоичной арифметики приходится сталкиваться с тем, что большинство нецелых чисел невозможно точно представить в двоичной системе, как нельзя, например, в десятичной системе точно представить в виде десятичной дроби число 1/3 = 0.333.
Рассмотрим пример. Если в простых дробях (1/3) х 3 = 1, то в десятичных 0.3333 х 3 = 0.9999.
В двоичной машинной арифметике происходит аналогичная ситуация. Но если человек сознает, что результат 0.9999. - та же единица, то компьютер этого не понимает. В результате в компьютерной арифметике (1 / 3) х 3 не равняется единице.
Еще пример. Пусть нам надо вычислить значение функции в точках от -2π до 2π с шагом π/6. Человек будет использовать значения -2π, -11π/6, -10π/6 и т.д. пока не придет к точке 2π. Компьютер (в арифметике с обычной точностью) вычислит значение -2π как -6.283185, а шаг представит значением 0.5235988. Это приведет к тому, что когда мы придем к нулю, то получим значение аргумента -9.536743х10⁻⁷, а в конечной точке получим аргумент 6.283184, который по абсолютной величине отличается от начального на единицу в младшей цифре, т.е. для компьютера при таком последовательном счете |-2π| ≠ 2π.
Третий пример. отрицательные целые числа представляются в компьютере в дополнительном коде, когда старший разряд является знаковым: 0 - это плюс, 1 - это минус.
Пусть мы прибавляем к 127 единицу в арифметике целых чисел, которым в двоичном представлении отведен один байт:
1111111₂ + 1₂ = 10000000₂ - тут все понятно, единичка перешла в старший, восьмой разряд. Но ведь он ЗНАКОВЫЙ! И вместо двоичного эквивалента 128 в компьютерной арифметике мы получаем отрицательное число! Причем, что самое интересное, из соображений эффективности эта ситуация обычно аппаратно не контролируется и в результате программы могут вести себя очень странно.
Некоторые авторитетные ученые в области вычислительной техники утверждают, что есть арифметика и есть компьютерная арифметика. Мне показалось это странным. И чем глубже я начал вникать в проблемы компьютерной арифметики, тем отчетливее стал понимать, что произошла некоторая путаница в представлениях.
Сначала я думал, что вся проблема в ограниченности разрядности представления двоичных и десятичных чисел, связанная с конечностью операционных регистров компьютера. Об этом говорят многие авторы, пишущие об этой проблеме. Но такое ограничение не выводит компьютерные вычисления за рамки классической арифметики с ограниченным числом цифр. Теория приближенных вычислений дает нам хорошо изученные инструменты для работы с такими числами. И нет никакой разницы, в какой из систем счисления выполняются вычисления.
Так в чем же отличие компьютерной арифметики от арифметики классической? А отличие состоит в том, что в компьютере десятичные вычисления выполняются в двоичной арифметике. Десятичную арифметику в BCD-кодах мы здесь не рассматриваем. При этом на входе вычислительного устройства входные данные задаются в десятичном виде с определенной заданной точностью (количеством значащих цифр) и результат вычислений мы тоже оцениваем в десятичном виде. Все вычисления в компьютере выполняются не над десятичными числами, а над их двоичными представлениями. Причем точность двоичного представления определяется количеством разрядов операционных регистров компьютера.
Таким образом, мы должны говорить не о десятичной или двоичной компьютерной арифметике, а о десятично-двоичной. И здесь кроется большая проблема, т.к., как известно, десятичная и двоичная системы счисления несоизмеримы.
В целочисленной арифметике двоичные и десятичные числа взаимно-однозначны. Когда же идет речь о числах с дробной составляющей, т.е. о вещественных числах, то все становится гораздо хуже. При вычислении в одном конкретном базисе (системе счисления) , если мы пользуемся правилами приближенных вычислений, мы получаем правильный результат, как для десятичных, так и для двоичных дробных чисел. Например, в десятичной арифметике – 0.12+ 0.121 ≈ 0.24, в двоичной – 0.101+0.1=1.001≈1.01. И это правильные результаты.
Если же нам надо вычислить, например, сумму 0.12+ 0.1 в десятично-двоичной арифметике, то мы должны представить эти десятичные числа в двоичном виде – 0.12 = 0.000111101011…, 0.1 = 0.000110011001… . Каждое двоичное представление наших десятичных чисел имеет бесконечное число цифр и поэтому точной десятичной суммы мы никогда не получим, сколько бы двоичных цифр мы ни брали. Так, вычисленная по правилам двоичной арифметики, сумма восьмиразрядных двоичных представлений наших десятичных чисел даст 0.00011110110 + 0.000110011010= 0.00111000011. В результате округления двоичного значения суммы до 8 значащих цифр мы получим число 0.0011100010, которое равно десятичному числу 0.220703125. Это число является представимым и оно является ближайшим числом, к которому было округлено двоичное число 0.00111000011.
А теперь, самое главное. Правила приближенных вычислений требуют после каждой математической операции оставлять только фиксированное количество верных цифр. Неверные цифры в числах приводят к неточным, а иногда и вовсе к ошибочным результатам. Последний случай особенно часто встречается при вычитании близких по значению чисел.
Для десятичных и двоичных чисел, неверные цифры, это те, которые расположены сразу за верными цифрами справа. В процессе десятично-двоичных вычислений мы вынуждены округлять двоичные числа до разрядности операционных регистров компьютера. Таким образом, мы отбрасываем те двоичные цифры, которые не участвуют при дальнейших вычислениях . Двоичные вычисления ведутся с точностью до разрядности операционных регистров компьютера. Но нас интересуют десятичные результаты вычислений с точностью до заданного количества десятичных цифр. Тривиальное округление двоичного представления десятичного числа не дает правильного десятичного округления этого числа до заданного количества десятичных цифр. Оно дает наилучшее приближение к ближайшему представимому числу, которое часто не является ближайшим к правильно округленному десятичному числу, представленному в двоичном виде.
Если обозначить через ◦[…] операцию округления, то ◦[0.0011100000]=◦[ 0.0011100010]= 0.0011100001. Следовательно ◦[0.0011100000] — ◦[0.0011100010] = 0. Таким образом, разность правильно округленных двоичных чисел дает строгий нуль. Следовательно, сравнение на равенство двух правильно округленных чисел становится тривиальной задачей. Упрощается также решение и ряда других задач, сложность которых обусловлена концепцией аппроксимации десятичных чисел двоичными кодами принятой в стандарте IEEE754. Суть этой концепции в том, что точность аппроксимации десятичных чисел определена количеством разрядов мантиссы двоичного числа, которое аппроксимирует заданное десятичное число.
Предлагаемый здесь подход позволяет существенно сократить разрядность операционных регистров в процессоре для заданной десятичной точности вычислений. А также избавиться от громоздких алгоритмов, призванных уменьшить ошибки в двоичных вычислениях для десятичных чисел. От компьютерной арифметики мы возвращаемся к обычной арифметике с числами ограниченной размерности.
В заключение отметим, что описанный выше подход к представлению десятичных чисел двоичными числами ограниченной разрядности в десятично-двоичных расчетах устраняет проблемы с ошибками аппроксимации и их влиянием на результаты вычислений, но при этом проблемы десятичной арифметики для чисел ограниченной разрядности никуда не деваются.
Юрий Спиридонов
Я изобретатель, имею 18 авторских свидетельств СССР на изобретения и два патента. Последние несколько лет занимаюсь исследованием проблем компьютерной математики.
Читайте также: