Синус угла - часть 6
-----------------------------------------------------
0 0 0 0 PI/4 SIN(R)
0 0 1 PI/4 PI/2 COS(PI/4-R)
0 1 0 PI/2 3*PI/4 COS(R)
0 1 1 3*PI/4 PI SIN(PI/4-R)
1 0 0 PI 5*PI/4 - SIN(R)
1 0 1 5*PI/4 3*PI/2 - COS(PI4-R)
1 1 0 3*PI/2 7*PI/4 - COS(R)
1 1 1 7*PI/4 2*PI - SIN(PI/4-R)
(R - остаток, 0<R<PI/4)
-----------------------------------------------------
Фиг. 7.28 SIN(X) в восьми секторах
Программа проверяет разряд C1 в регистре состояния, чтобы
определить, должна ли она использовать остаток R, или его надо
вычесть из PI/4. Так как PI/4 еще находится в одном из регистров,
это сделать просто. Если вычитание не требуется, команда FCOMP
удаляет из стека ненужное значение PI/4.
Затем команда FPTAN вычисляет частичный тангенс. Результат
работы команды показан, как OPP/ADJ (сокращения от английских слов
Opposite (противоположный) и Adjacent (соседний)), что равно
тангенсу угла R или PI/4-R, в зависимости от того, что было
выбрано. С помощью этих двух чисел теперь можно опеределить синус
или косинус угла. Например, синус, заданный парой чисел OPP/ADJ,
можно вычислить по формуле
SIN(X) = OPP/SQR(OPP**2+ADJ**2), где TAN(X) = OPP/ADJ
Чтобы вычислить косинус, нужно числитель заменить на ADJ. Мы
решаем, нужен ли синус или косинус, анализируя запомненные
описатели октанта, т.е. проверяя значения разрядов C3 и C1.
Команда TEST выделяет эти значения, а команда JPE делает переход,
если они оба нулевые или оба единичные. В этом случае мы вычисляем
синус; если же они различны, мы вычисляем косинус, что достигается
заменой местами значений OPP и ADJ в стеке регистров.
Далее следующие команды сопроцессора 8087 вычисляют значение
синуса (или косинуса) по значению частичного тангенса.
Единственный шаг, который еще надо выполнить - это определение
окончательного знака результата. В случае синуса результат
отрицателен, если угол находится в октантах от четвертого до
седьмого. Проверка разряда C0 определяет верный знак результата.
Затем программа FLOAT_ASCII, показанная на Фиг. 7.25, печатает
число в плавающем формате. Управление возвращается назад, к началу
цикла, если еще не пройдены все октанты. Нижняя часть Фиг. 7.27
иллюстрирует результат выполнения этой программы.
Содержание Назад Вперед