Переход на главную страницу сайта “Термист” Термист
Термомеханическое упрочнение арматурного проката
технология, средства, разработка
Главная О сайте Стандарты Технология Устройства
Лаборатория Библиотека Глоссарий Желтые страницы Обратная связь

Что можно сказать относительно деления?

Арифметические вычисления с высокой точностью

Чарлз Уэзерелл

Предыдущие разделы:
Арифметические вычисления числа π с высокой точностью. Общие соображения.
Как можно быстро умножать?
Алгоритм Тоома - Кука
Алгоритм быстрого умножения Тоома - Кука
Комментарии к алгоритму Тоома - Кука

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

Даны два числа [m, u] и [n, v]; мы считаем, что u ≥ v (хотя это предположение несущественно) и что n-й бит v равен 1 (т.е.у v нет старших нулей). Чем больше разница размеров u и v, тем более точным будет частное; разницу можно увеличить, умножая и на степень двойки. Отметим, что алгоритм деления будет неоднократно вызывать алгоритм умножения. Для нескольких первых из этих умножений можно воспользоваться обычной операцией умножения коротких чисел. Кроме того, все умножения и деления на степень двойки суть фактически сдвиги влево и вправо.

1. (Выбор размера обратного.) Найти наименьшее j, такое, что 2j ≥ max(m, 2n). Присвоить k значение 2j-1.

2. (Нормализация v.) Присвоить [k, v] значение 2k-n [n, v]. На этом шаге мы сдвигаем v влево, чтобы оно заняло k битов, причем левый бит был бы равен 1. Присвоить [2, a] значение [2, 2].

3. (Вычисление последовательных приближений к 1/v.) Выполнить шаг 4 для i = 1, 2, ..., j-1.

4. (Вычисление приближения из 2i битов.) Присвоить [2i+1, d] значение
23·2^i[2i-1+1, a] - [2i-1+1, a]2·([k, v]/2k-2^i).

Деление в скобках (фактически сдвиг вправо) должно выполняться до умножения; идея состоит в том, чтобы ускорить умножение, отбросив лишние биты v, ненужные в данном приближения. Хотя кажется, что результат d может содержать больше 2i+1 битов, этого никогда не произойдет. Затем присвоить [2i+1, а] значение [2i+1, d]/2i-1.

5. (Улучшение окончательной оценки.) Присвоить [3k, d] значение
22k·[k+1, a] - [k+1, a]2·[k v].
Затем присвоить [k+1, a] значение
([3k, d] + 22k-2)/22k-1.

6. (Окончательное деление.) Выдать в качестве результата
([k+1, a]·[m, u] + 2k+n-2)/2k+n-1.

Примечание переводчика:

1) В алгоритм, вероятно, необходимо внести следующие изменения:
a) на шаге 1 заменить max(m, 2n) на max(2m-2n, 2n);
b) на шаге 4 заменить 23·2^i на 23·2^(i-1).

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

Читать дальше:
Как использовать алгоритмы?
Литература

 



Подготовлено по публикации: Уэзерелл Ч. Этюды для программистов: Пер. с англ. - М.: Мир, 1982. - 288 с. Стр. 125 - 143.



 

К началу страницы


Web-сайт “Термист” (termist.com)
Термомеханическое упрочнение арматурного проката

Отсутствие ссылки на использованный материал является нарушением заповеди "Не укради"

Редактор сайта: Гунькин И.А. (termist.com@gmail.com)