Описание дополнительных математических функций HomeLisp

В этом разделе описывается скромная библиотека математических функций, встроенных в HomeLisp. Математические функции, относящиеся к "классическому" Лиспу описаны в соответствующем разделе документации. Основное назначение приводимой библиотеки - обеспечение графики и численных методов.

Имя функции К-во аргументов Тип аргументов Выполняемое действие
ACS   1 FIXED/FLOAT Вычисляет значение арккосинуса от значения аргумента. Если значение аргумента превышает по модулю единицу, выдается сообщение.
ASN   1 FIXED/FLOAT Вычисляет значение арксинуса от значения аргумента. Если значение аргумента превышает по модулю единицу, выдается сообщение.
ATN   1 FIXED/FLOAT Вычисляет значение арктангенса от значения аргумента.
CH   1 FIXED/FLOAT Вычисляет значение гиперболического косинуса от значения аргумента
COS   1 FIXED/FLOAT Возвращает косинус аргумента. Аргумент должен быть задан, естественно, в радианах
EXP   1 FIXED/FLOAT Вычисляет значение экспоненты от значения аргумента.
LOG   1 FIXED/FLOAT Вычисляет значение натурального логарифма (по основанию E) от значения аргумента. Если аргумент неположителен - выдается сообщение об ошибке.
RND   1 FIXED/FLOAT Генерирует случайное число из дианазона [0,A], где A-значение аргумента. Если тип аргумента FIXED, то случайное число тоже будет иметь тип FIXED
ROUND   2 1-FLOAT; 2-FIXED Выполняет округление значения первого аргумента до количества десятичных знаков после точки, заданного значением второго аргумента.
SH   1 FIXED/FLOAT Вычисляет значение гиперболического синуса от значения аргумента
SIGN   1 FIXED/FLOAT Вычисляет знак значения аргумента. Тип результата совпадает с типом аргумента.
SIN   1 FIXED/FLOAT Возвращает синус аргумента. Аргумент должен быть задан, естественно, в радианах
SQR   1 FIXED/FLOAT Извлекает квадратный корень из значения аргумента. Если значение аргумента отрицательно - выдается сообщение об ошибке
ACS  

Функция ACS принимает единственный аргумент числового типа (FIXED или FLOAT). Она вычисляет значение арккосинуса от значения аргумента. Тип значения, разумеется, всегда FLOAT. Если значение аргумента превышает по модулю единицу, выдается сообщение, а результат устанавливается равным атому ERRSTATE Примеры:


(acs -1)

==>  3.14159265358979

(acs 1)

==>  0.0

(acs 0.5)

==>  1.0471975511966

(acs 1.5)

Модуль аргумента ACS превышает 1
==>  ERRSTATE

(* 4 5 (acs 3))

Модуль аргумента ACS превышает 1
==>  ERRSTATE

В последнем примере производится попытка вычислить арккосинус от 3. Это приводит к ошибке. Возникший в качестве промежуточного результата атом ERRSTATE "поглощает" результаты всех предыдущих вычислений. Конечный результат равен ERRSTATE.

ASN  

Функция ASN принимает единственный аргумент числового типа (FIXED или FLOAT). Она вычисляет значение арксинуса от значения аргумента. Тип значения, разумеется, всегда FLOAT. Если значение аргумента превышает по модулю единицу, выдается сообщение, а результат устанавливается равным атому ERRSTATE Примеры:


(asn 1)

==>  1.5707963267949

(asn -1)

==>  -1.5707963267949

(asn 0)

==>  0.0

(asn 1.5)

Модуль аргумента ASN превышает 1
==>  ERRSTATE

(* 5 6 (asn 6) 5)

Модуль аргумента ASN превышает 1
==>  ERRSTATE

В последнем примере производится попытка вычислить арксинус от 6. Это приводит к ошибке. Возникший в качестве промежуточного результата атом ERRSTATE "поглощает" результаты всех предыдущих вычислений. Конечный результат равен ERRSTATE.

ATN  

Функция ATN принимает единственный аргумент числового типа (FIXED или FLOAT). Она вычисляет значение арктангенса от значения аргумента. Тип значения, разумеется, всегда FLOAT. Примеры:


(atn 1)

==>  0.785398163397448

(asn -1)

==>  -0.785398163397448

(atn 0)

==>  0.0
CH  

Функция CH принимает единственный аргумент числового типа (FIXED или FLOAT). Она вычисляет значение гиперболического косинуса от значения аргумента. Тип значения, разумеется, всегда FLOAT. Используется прямое выражение гиперболического косинуса через экспоненту:

ch(x)=0.5(ex+e-x)

Если значение аргумента превышает 300, возникает переполнение. Примеры:


(ch 1)

==>  1.54308063481524

(ch -1)

==>  1.54308063481524

(ch 100)

==>  1.34405857090807E+43

(ch 400)

Переполнение при вычислении CH
==>  ERRSTATE

В приведенном выше примере хорошо видно, что гиперболический косинус (как и его тригонометрический брат) явлется четной функцией.

COS  

Функция COS принимает единственный аргумент числового типа (FIXED или FLOAT). Она вычисляет значение косинуса от значения аргумента. Тип значения, разумеется, всегда FLOAT. Аргумент должен выражаться в радианах. Примеры:


(cos 0)

==>  1.0

(cos _Pi)

==>  -1.0

(cos -_Pi)

==>  -1.0

(cos (* 0.5 _Pi))

==>  -3.49148336110938E-15

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

EXP  

Функция EXP принимает единственный аргумент числового типа (FIXED или FLOAT). Она вычисляет значение экспоненты от значения аргумента. Тип значения, разумеется, всегда FLOAT. Аргумент не должен превышать 300. Примеры:


(exp 0)

==>  1.0

(exp 1)

==>  2.71828182845905

(exp -1)

==>  0.367879441171442

(exp 400)

Переполнение при вычислении EXP
==>  ERRSTATE

Следует обратить внимание на то, что в числе встроенных функций HomeLisp имеется функция EXPT, позволяющая вычислить Xy (при разумных значениях X и y). В принципе можно вычислить ex с использованием EXPT, введя (EXPT _E x). Функция EXP сделает это же действие быстрее.

LOG  

Функция LOG принимает единственный аргумент числового типа (FIXED или FLOAT). Она вычисляет значение натурального логарифма от значения аргумента. Тип значения, разумеется, всегда FLOAT. Аргумент должен быть положительным числом. Примеры:


(log 1)

==>  0.0

(log 5)

==>  1.6094379124341

(log 50)

==>  3.91202300542815

(log _E)

==>  1.0

(log 0)

Попытка вычислить логарифм неположительного числа
==>  ERRSTATE

(log -100)

Попытка вычислить логарифм неположительного числа
==>  ERRSTATE

При необходимости вычислить логарифм по основанию, отличному от e, можно воспользоваться формулой:


logaX = (logbX)/(logba)

В частности, для вычисления десятичного логарифма подойдет функция lg, определение которой вместе с примерами вызова приводится ниже.


(defun lg (x) (/ (log x) (log 10)))

==>  lg

(lg 1000)

==>  3.0

(lg 10)

==>  1.0

(lg 0.01)

==>  -2.0
RND  

Функция RND принимает единственный аргумент числового типа (FIXED или FLOAT). Функция выдает случайное число из диапазона [0,X], где X - значение аргумента. Если аргумент имеет тип FIXED, то и результат будет иметь тип FIXED. Соответственно, при вызове функции с аргументом типа FLOAT, результат будет иметь тип FLOAT. Примеры:

(rnd 1)

==>  0

(rnd 1)

==>  1

(rnd 1)

==>  1

(rnd 1)

==>  0

(rnd 1.0)

==>  0.423560559749603

(rnd 1.0)

==>  0.441152453422546

(rnd 1.0)

==>  0.921030580997467

(rnd 1.0)

==>  0.320934772491455

(rnd 1.0)

==>  0.290106475353241

(rnd 2.0)

==>  1.62687706947327

(rnd 100.0)

==>  13.8400852680206

(rnd 100)

==>  92

Функция RND вызывает соответствующую функцию Visual Basic. Предварительной рандомизации не требуется - она выполняется автоматически при инициализации среды HomeLisp.

ROUND  

Функция ROUND принимает два аргумента: первый должен иметь тип FLOAT, а второй - FIXED. Функция выполняет округление значения первого аргумента, оставляя количество десятичных знаков, заданное значением второго аргумента. Примеры:

(round 567.56 1)

==>  567.6

(round 567.56 0)

==>  568.0
SH  

Функция SH принимает единственный аргумент числового типа (FIXED или FLOAT). Она вычисляет значение гиперболического синуса от значения аргумента. Тип значения, разумеется, всегда FLOAT. Используется прямое выражение гиперболического синуса через экспоненту:

sh(x)=0.5(ex-e-x)

Если значение аргумента превышает 300, возникает переполнение. Примеры:


(sh 1)

==>  1.1752011936438

(sh -1)

==>  -1.1752011936438

(sh 100)

==>  1.34405857090807E+43

(sh 400)

Переполнение при вычислении SH
==>  ERRSTATE

В приведенном выше примере хорошо видно, что гиперболический синус (как и его тригонометрический брат) явлется нечетной функцией.

SIGN  

Функция SIGN принимает один аргумент типа FIXED или FLOAT. Для положительных значений аргумента функция возвращает 1, для отрицательных -1, а для нулевых - 0. Тип результата совпадает с типом аргумента. Примеры:

(sign 5)

==>  1

(sign -5)

==>  -1

(sign 0)

==>  0

(sign 1.0)

==>  1.0

(sign -1.0)

==>  -1.0

(sign -0.0)

==>  0.0
SIN  

Функция SIN принимает единственный аргумент числового типа (FIXED или FLOAT). Она вычисляет значение косинуса от значения аргумента. Тип значения, разумеется, всегда FLOAT. Аргумент должен выражаться в радианах. Примеры:


(sin 0)

==>  0.0

(sin (* 0.5 _pi))

==>  1.0

(sin _pi)

==>  1.22460635382238E-16

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

SQR  

Функция SQR принимает единственный аргумент числового типа (FIXED или FLOAT). Она вычисляет значение квадратного корня от значения аргумента. Тип значения, разумеется, всегда FLOAT. Примеры:

(sqr 25)

==>  5.0

(sqr 625)

==>  25.0

(sqr 2)

==>  1.4142135623731

(sqr 3)

==>  1.73205080756888

(sqr -9)

Попытка извлечь квадратный корень из отрицательного числа
==> ERRSTATE

Следует обратить внимание на то, что в числе встроенных функций HomeLisp имеется функция EXPT, позволяющая вычислить Xy (при разумных значениях X и y). В принципе можно вычислить квадратный корень от x с использованием EXPT, введя (EXPT x 0.5). Функция SQR сделает это же действие быстрее.