Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Наличие команд трансцендентных функций значительно усиливает вычислительную
мощность процессора. Результат вычислений таких функций
имеет высокую точность. Необходимо учитывать тот факт, что аргументы
тригонометрических функций задаются в радианах. Если, к примеру, мы
хотим вычислить синус угла А, заданного в градусах, то для перевода в радианы
можно использовать формулу
А Р А Д = А* Р 1 / 180,
где А Р А Д — величина угла в радианах, А — величина угла в градусах.


Теперь пока давайте немного вспомним о том, что такое синус угла и как рассчитать его.
Итак, синусом строго угла прямоугольном треугольнике является отношение противоположного данному острому углу катета к гипотенузе данного треугольника.
Из приведенного ниже примера видно, что синусом угла АЛЬФА является соотношение катета FK к гипотенузе DF.

 

Рассмотрим небольшой пример, в котором будут вычисляться синус и косинус
угла. В качестве каркаса приложения будем использовать консольное
приложение, сгенерированное Мастером приложений Delphi 7. Операторы
ввода-вывода такого приложения позволяют легко манипулировать любыми
типами данных, а это упрощает исходный текст программы. В этом приложении
будем использовать две простейшие команды Delphi — ReadLn и
WriteLn. Первая из этих команд читает ввод с клавиатуры, а вторая выводит
значения на экран. Программа, исходный текст которой приведен в листинге
2.26, довольно проста.

 

Листинг 2.26. Программа, вычисляющая синус и косинус угла
program sincos;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
angle: Single;
angleRad: Single;
Sinus, Cosinus: Single;
procedure SinCos(angle: Single); assembler;
asm
f init
fid DWORD PTR angleRad
fid DWORD PTR angleRad
fsin
fstp DWORD PTR Sinus
fcos
fstp DWORD PTR Cosinus
fwait
end;
begin
Write('Enter degrees: ') ;
ReadLn(angle);
AngleRad := angle*3.14/180;
SinCos(angleRad);
WriteLn('The angle in degrees = angle:5:2);
WriteLn('Sinus of angle = ', Sinus:5:3);
WriteLn('Cosinus of angle = ', Cosinus:5:3);
ReadLn;

 

В программе для вычисления значений синуса и косинуса используется
процедура sinCos на языке ассемблера. Основная программа читает введенные
посредством клавиатуры значения угла и, преобразовав полученное
значение угла в радианы, вызывает процедуру вычисления синуса и косинуса
sinCos. Команды fsin и fcos вычисляют значения синуса и косинуса
угла, находящегося в вершине стека S T ( 0 ) . Команды не имеют операндов и
возвращают результат в том же регистре S T ( 0 ) . Предыдущее значение регистра
(значение угла) теряется после операции вычисления синуса. Вот почему
возникает необходимость выполнения двух команд fid в процедуре!

Среди команд вычисления значений тригонометрических функций есть
fsincos. Эта команда вычисляет синус и косинус угла, находящегося в
вершине стека сопроцессора ST(0). Команда не использует операнды и возвращает
результат в регистрах ST (о) и ST (1) . При этом в ST (о) помещается
значение синуса, а в регистр ST(1) — косинуса. Изменим предыдущий
пример так, чтобы можно было использовать команду fsincos.
Исходный текст программы представлен в листинге 2.27.

 

Листинг 2.27. Программа, вычисляющая синус и косинус угла с помощью
функции FSINCOS V
program cl;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
angle: Integer;
angleRad: Single;
Sinus, Cosinus: Single;
procedure SinCos(angle: Single); assembler;
asm
f init
fid DWORD PTR angleRad
fsincos
fxch st(l)
fstp DWORD PTR Sinus
fstp DWORD PTR Cosinus
fwait
end;
begin
Write('Enter angle in degrees: ' ) ;
ReadLn(angle);
AngleRad := angle*3.14/180;
SinCos(angleRad);
WriteLn('Angle in degrees = ', angle);
WriteLn{'Sinus of angle = ', Sinus:5:3);
WriteLn('Cosinus of angle = ', Cosinus:5:3);
ReadLn;
end.

 


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru