Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 114


{ Функция возвращает значение угла наклона отрезка (0,0)-(X,Y) к оси X в радианах. Возвращаемое значение находится в диапазоне 0..2*Pi и учитывает знаки значений X и Y. }

| >FUNCTION ATAN2( X,Y : Real ) : Real;

| >VAR a : Real;

| BEGIN

| >if X=0 then a:=Pi/2

| >else a:=Abs( ArcTan( Y/X ) );

| >case ( Byte(X>0) + Byte(Y>=0) ) of

| >2 : ATAN2 := a;

| >1 : if X>0 then ATAN2 := 2*Pi-a

| >else ATAN2 := Pi - a;

| >0 : ATAN2 := Pi + a

| >end {case}

| END;

{==== ПРОВЕРКА РАБОТОСПОСОБНОСТИ ФУНКЦИИ ====}

| >CONST { константа перевода радиан в градусы }

| >R2D = 180/3.1415926;

| VAR

| >i : Integer;

| >x, sx, ex : Real;

| BEGIN

| >for i:=0 to 360 do begin

{ цикл по градусам }

| >x:=i/R2D; { перевод в радианы }

| >sx:=Sinx); cx:=Cos(x); { синус и косинус i }

| >x:=ATAN2(cx,sx)*R2D; { угол в градусах }

| >WriteLn(i:3, 'град. Функция возвращает: ', x:-10:6 )

| >end; { конец цикла по i }

| >ReadLn { пауза до нажатия клавиши ввода }

| END.


Рис. 9.3

- 178 -

Эта функция возвращает корректное значение угла в диапазоне от 0 до 2*Pi, что гораздо удобнее в технических расчетах.

9.4.1.3. Доопределение функций. Часто ощущается нехватка функций arccos и arcsin. Но их нетрудно написать самим (рис. 9.4).


| >{ Функция возвращает главное значение arcCos X (в рад) }

| >FUNCTION ArcCos( x : Real ): Real;

| BEGIN

| >if x=0

| >then ArcCos:=Pi/2

| >else ArcCos:=ArcTan(Sqrt(1-Sqr(x)) / x) + Pi*Byte(x<0)

| END;

| >{Функция возвращает главное значение арксинуса X(в рад)}

| >FUNCTION ArcSin( x : Real ) : Real;

| BEGIN

| >if Abs(x)=1

| >then ArcSin:=0

| >else ArcSin:=ArcTan(x / Sqrt( 1-Sqr(x) ) )

| END;


Рис. 9.4


Аналогичным образом можно построить библиотеку любых необходимых математических функций, сделав в итоге свой собственный математический модуль. Все необходимые «кирпичики» имеются в базовом наборе языка. Так, например, можно ввести десятичный логарифм (рис. 9.5) или степенную функцию (рис. 9.6).


| >{ Функция возвращает значение десятичного логарифма }

| >FUNCTION Log10( x : Real ) : Real;

| BEGIN

| >Log10:= Ln(x)/Ln(10)

| END;


Рис. 9.5


| >{ Функция возвращает значение A в степени X (A>0) }

| >FUNCTION Pwr(a,x : Real ) : Real;

| BEGIN

| >Pwr := Exp( x * Ln(a) )

| END;


Рис. 9.6

- 179 -

9.4.1.4. Функции Frac, Int и Trunc. Эти функции соответствуют математическим функциям взятия дробной и целой части числа соответственно. Помните, что

Frac( X ) = X - Int( X )

и знак X переходит на значение функции Frac.

Функция Trunc отличается от Int только типом возвращаемого значения. Int записывает целое число в вещественном формате (после точки — нули), a Trunc — в целочисленном. Такая двойственность необходима для совместимости в операторах присваивания.