Adaptive precision arithmetic
Содержание
Мотивация
Все вычисления, производимые компьютером во floating-point[1] модели, имеют погрешность. При большом количестве арифметических действий она возрастает. Во многих случаях результирующая погрешность уже не устраивает, и требуется либо абсолютно точное вычисление, либо меньшая погрешность. Одним из решений данной проблемы является хранение чисел в виде рациональных дробей, в которых числитель и знаменатель представляется в виде длинного целого числа. Но работать с такими числами довольно "дорого" по времени и тяжело в реализации: необходимо писать факторизацию чисел, эффективно сокращать дроби. Для улучшения работы нужны определенные оптимизации. Одной из них и является использование adaptive precision arithmetic.
Background
Большинство современных процессоров поддерживают числа с плавающей точкой в форме
. Значащая часть числа (мантисса) представляет собой -битное двоичное число в форме , где каждое обозначает один бит. Также имеется один бит на знак.Числа с плавающей точкой, как правило, нормализованы, то есть если число не равно нулю, то первый значимый бит равен единице, а экспонента устанавливается соответственно. Например, в
-битной арифметике число 1101 (десятичное 13) будет выглядеть как .Базовые понятия
Расширения
Определение: |
Два числа | и называются неперекрывающимися (англ. nonoverlapping), если номер наименьшего значимого бита числа (нумерация справа налево) больше, чем номер наибольшего значимого бита числа , или наоборот.
Более формально, и не перекрываются, если существует такое целое число и , что и , или и .
Ноль не пересекается ни с одним другим числом.
Например, числа 1100 и -10.1 не пересекаются, а 101 и 10 - пересекаются.
Иногда для использовании точной арифметики может понадобиться больше, чем
бит для хранения величин. В связи с этим вводится одно из базовых форм хранения чисел для такой арифметики.Определение: |
Расширением числа | называется такое его представление , где каждое выражено -битным числом с плавающей точкой и называется компонентой этого расширения.
Определение: |
Расширение называется неперекрывающимся, если все его компоненты взаимно не перекрываются. |
Как правило, расширения должны быть неперекрывающимися, а их компоненты должны быть упорядочены от большей к меньшей по величине (то есть - большая). Далее будут рассматриваться именно такая их форма.
Стоит отметить, что число может быть представлено несколькими возможными неперекрывающимися расширениями: 1100 + -10.1 = 1001 + 0.1 = 1000 + 1 + 0.1.
Неперекрывающиеся расширения нужны, например, для того, чтобы быстро вычислять знак выражения (смотрим знак большей по размеру компоненты), или для грубой оценки значения всего расширения (берем большую по величине компоненту).