Сложение и вычитание
Рассмотрим принципы вещественной компьютерной арифметики на простых примерах. Сложим 7,2510 = 111,01 и 1,7510 = 1,11 (здесь и далее будем явно указывать систему счисления только для десятичных чисел). Представим эти числа в нормализованном виде: 111,01 • 20 = 1,1101 • 210 и 1,11 • 20 (ещё раз подчеркнём, что значащие части и порядки чисел указываются в двоичной системе!). Не будем сейчас использовать «скрытую» единицу: это нужно только при сохранении чисел в памяти, а при изучении арифметических действий удобнее иметь «развёрнутые» значения.
Числа, записанные в форме с плавающей запятой, нельзя непосредственно сложить. Дело в том, что когда числа имеют разные порядки, их значащие части оказываются сдвинутыми друг относительно друга. Поэтому первое, что делает процессор перед сложением вещественных чисел, — выравнивает их порядки до большего. Число, имеющее меньший порядок р2 (и значащую часть z2), «подгоняется» к числу с большим порядком р1 следующим образом:
1. Если р2 = p1, то порядки выровнены и преобразования закончены.
2. p2 = p2 + 1.
3. Сдвинуть значащую часть z2 на один разряд вправо.
4. Перейти к шагу 1.
Для нашего примера разность порядков равна 10 - 0 = 10 = 210, так что для выравнивания порядков значащую часть придётся сдвинуть дважды (порядок при этом увеличится на 2): 1,11 • 20 = 0,0111 • 210. Подчеркнём, что ради проведения сложения нормализацию пришлось временно нарушить.
Теперь числа имеют одинаковый порядок и их значащие части можно складывать:
Полный результат (с учётом порядка) равен 10,01 • 210 (убедитесь, что получившееся число равно 910). Но значащая часть результата больше 2, поэтому для записи числа в память его необходимо нормализовать: 10,01 • 210 = 1,001 • 211.
В этом примере мы нигде не учитывали ограниченность разрядной сетки и для простоты специально взяли короткие числа. Как же обстоит дело в реальных вычислениях? При выравнивании порядков происходит сдвиг значащей части меньшего из чисел вправо, при этом ее младшие (правые) разряды могут выйти за пределы разрядной сетки и будут отброшены. При сложении чисел с большой разностью порядков в результате таких сдвигов меньшее число может стать равно нулю. Например, представьте себе, что при 24-битной значащей части у слагаемых А и В разность порядков составляет, например, 2610. В этом случае при выравнивании порядков произойдёт 26 сдвигов значащей части вправо, так что абсолютно все(!) её разряды исчезнут. В результате сложения окажется, что А + В = А, хотя В ≠ 0 — это очередной (но далеко не единственный) пример погрешности компьютерных вычислений.
Следующая страница Умножение и деление