|
Программируем по-русски
|
Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку. Издатель Глагола
|
(******************************************************************************) (**) ОТДЕЛ Матем; (****************************************************************************** * НАЗНАЧЕНИЕ: основные математические функции ****************************************************************************** * ПРИМЕЧАНИЯ: после вызова задачи переменная <Матем.код> может стать # 0, * это означает, что ответ задачи содержит не результат вычислений, а * особое значение. * * Источники, ссылки, библиография Debord J., Библиотека математических подпрограмм tpmath.zip Goffe B., Программа SimAnn.FOR (Simulated Annealing in Fortran) http://www.netlib.org/opt/simann.f EISPACK: Библиотека Фортран функций для вычисления собственных значений и векторов http://www.netlib.org/eispack Marsaglia G., Тесты для генераторов случайных чисел http://stat.fsu.edu/~geo/diehard.html Moshier S., Библиотека математических подпрограмм http://www.moshier.net Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Численные рецепты на Паскале http://garbo.uwasa.fi/pc/turbopas.html Пакет численных методов для Турбо Паскаля Borland International, 1986 * ******************************************************************************) ИСПОЛЬЗУЕТ Асм ИЗ "..\Иное\", ОС ИЗ "..\Обмен\"; (****************************************************************************** * Вид, задающий точность вычислений ******************************************************************************) ВИД Вещ- = ШИРВЕЩ; (****************************************************************************** * Код ошибки после выполнения функций ******************************************************************************) ПОСТ ВНЕОБЛАСТИ- = -1; (* аргумент вне области определения функции *) ОСОБЕННОСТЬ- = -2; (* особенная точка *) ПЕРЕПОЛНЕНИЕ-= -3; (* переполнение результата *) ОБНУЛЕНИЕ- = -4; (* обнуление результата *) ПЕР код+:ЦЕЛ; (* переменная для опознавания результата функций *) пГаусс:Вещ; (* память для следующего случ. числа, распределенного по Гауссу *) впГаусс:КЛЮЧ; (* ВКЛ, если <пГаусс> уже содержит число *) (****************************************************************************** * Математические постоянные ******************************************************************************) ПОСТ ПИ- = 3.14159265358979323846D0; (* ПИ *) ПИ2- = 6.28318530717958647693D0; (* 2*ПИ *) ЛН2- = 0.69314718055994530942D0; (* ln(2) *) ЛН10- = 2.30258509299404568402D0; (* ln(10) *) ЛНПИ- = 1.14472988584940017414D0; (* ln(ПИ) *) КВКОР2- = 1.41421356237309504880D0; (* квкор(2) *) КВКОР2ПИ- = 2.50662827463100050242D0; (* квкор(2*ПИ) *) КВКОР2Д2- = 0.70710678118654752440D0; (* квкор(2)/2 *) ЛНКВКОР2ПИ- = 0.91893853320467274178D0; (* ln(квкор(2*ПИ)) *) (****************************************************************************** * Машино-зависимые постоянные ******************************************************************************) ПОСТ МАКСВЕЩ- = МАКС(Вещ); МАКСЛН- = 709.7827128933840D0; МИНЛН- = -708.3964185322641D0; МАШЕПС- = 2.220446049250313D-16; (****************************************************************************** * Тригонометрические функции ******************************************************************************) (* заготовки ЗАДАЧ *) ЗАДАЧА^ sin-(x:Вещ):Вещ; ЗАДАЧА^ arcsin-(x:Вещ):Вещ; ЗАДАЧА^ cos-(x:Вещ):Вещ; ЗАДАЧА^ arccos-(x:Вещ):Вещ; ЗАДАЧА^ sincos-(x,sinX+,cosX+:Вещ); ЗАДАЧА^ tg-(x:Вещ):Вещ; ЗАДАЧА^ arctg-(x:Вещ):Вещ; ЗАДАЧА^ arctg2-(y,x:Вещ):Вещ; (* угол (Ox,OM) для m(x,y) *) ЗАДАЧА^ Пифагор-(x,y:Вещ):Вещ; (* квкор(x2+y2) *) ЗАДАЧА^ уголВПи-(тета:Вещ):Вещ; (* угол в -ПИ..ПИ *) (****************************************************************************** * Логарифмические, показательные и степенные функции ******************************************************************************) (* заготовки ЗАДАЧ *) ЗАДАЧА^ exp-(x:Вещ):Вещ; ЗАДАЧА^ exp2-(x:Вещ):Вещ; (* 2x *) ЗАДАЧА^ exp10-(x:Вещ):Вещ; (* 10x *) ЗАДАЧА^ ln-(x:Вещ):Вещ; ЗАДАЧА^ log2-(x:Вещ):Вещ; (* ln по основанию 2 *) ЗАДАЧА^ log10-(x:Вещ):Вещ; (* десятичный логарифм *) ЗАДАЧА^ loga-(x,a:Вещ):Вещ;(* ln по основанию a *) ЗАДАЧА^ степВЦ-(x:Вещ; n:ЦЕЛ):Вещ; (* xn *) ЗАДАЧА^ степВВ-(x,y:Вещ):Вещ; (* xy, x >= 0 *) ЗАДАЧА^ кв-(x:Вещ):Вещ; (* x*x = x2 *) ЗАДАЧА^ квкор-(x:Вещ):Вещ; (* x0,5 *) (****************************************************************************** * Гиперболические функции ******************************************************************************) (* заготовки ЗАДАЧ *) ЗАДАЧА^ sh-(x:Вещ):Вещ; ЗАДАЧА^ ch-(x:Вещ):Вещ; ЗАДАЧА^ shch-(x:Вещ; shX+,chX+:Вещ); ЗАДАЧА^ th-(x:Вещ):Вещ; ЗАДАЧА^ Arsh-(x:Вещ):Вещ; ЗАДАЧА^ Arch-(x:Вещ):Вещ; ЗАДАЧА^ Arth-(x:Вещ):Вещ; (****************************************************************************** * мин, макс, знак числа и обмен 2-х чисел ******************************************************************************) (* заготовки ЗАДАЧ *) ЗАДАЧА^ мин-(x,y:Вещ):Вещ; ЗАДАЧА^ макс-(x,y:Вещ):Вещ; ЗАДАЧА^ минЦ-(x,y:ЦЕЛ):ЦЕЛ; ЗАДАЧА^ максЦ-(x,y:ЦЕЛ):ЦЕЛ; ЗАДАЧА^ знак-(x:Вещ):ЦЕЛ; ЗАДАЧА^ знак2-(x,y:Вещ):Вещ; (* x*знак(y) *) ЗАДАЧА^ обмен-(x+,y+:Вещ); ЗАДАЧА^ обменЦ-(x+,y+:ЦЕЛ); (****************************************************************************** * Источники случайных чисел ******************************************************************************) (* заготовки ЗАДАЧ *) ЗАДАЧА^ случ0-(случ:ЦЕЛ); (* Выставка источника случайных чисел в начальное состояние *) ЗАДАЧА^ случЦ-():ЦЕЛ; (* целые от -2147483648 до 2147483647 *) ЗАДАЧА^ случ-():Вещ; (* вещественные в интервале [0,1) (т.е. не включая 1) *) ЗАДАЧА^ случСГ-():Вещ;(* вещественные, распределённые по стандартному Гауссу (мю=0,сигма=1) *) ЗАДАЧА^ случГ-(мю,сигма:Вещ):Вещ;(* вещественные, распределённые по Гауссу *) (****************************************************************************** * мин, макс, знак, обмен ******************************************************************************) (******************************************************************************) ЗАДАЧА мин-(x,y:Вещ):Вещ; УКАЗ ЕСЛИ x < y ТО ВОЗВРАТ x ИНАЧЕ ВОЗВРАТ y КОН КОН мин; (******************************************************************************) ЗАДАЧА макс-(x,y:Вещ):Вещ; УКАЗ ЕСЛИ x > y ТО ВОЗВРАТ x ИНАЧЕ ВОЗВРАТ y КОН КОН макс; (******************************************************************************) ЗАДАЧА минЦ-(x,y:ЦЕЛ):ЦЕЛ; УКАЗ ЕСЛИ x < y ТО ВОЗВРАТ x ИНАЧЕ ВОЗВРАТ y КОН КОН минЦ; (******************************************************************************) ЗАДАЧА максЦ-(x,y:ЦЕЛ):ЦЕЛ; УКАЗ ЕСЛИ x > y ТО ВОЗВРАТ x ИНАЧЕ ВОЗВРАТ y КОН КОН максЦ; (******************************************************************************) ЗАДАЧА знак-(x:Вещ):ЦЕЛ; УКАЗ ЕСЛИ x >= 0 ТО ВОЗВРАТ 1 ИНАЧЕ ВОЗВРАТ -1 КОН КОН знак; (******************************************************************************) ЗАДАЧА знак2-(x,y:Вещ):Вещ; УКАЗ ЕСЛИ y < 0 ТО ВОЗВРАТ -МОДУЛЬ(x) ИНАЧЕ ВОЗВРАТ МОДУЛЬ(x) КОН КОН знак2; (******************************************************************************) ЗАДАЧА обмен-(x+,y+:Вещ); ПЕР врем:Вещ; УКАЗ врем:=x; x:=y; y:=врем КОН обмен; (******************************************************************************) ЗАДАЧА обменЦ-(x+,y+:ЦЕЛ); ПЕР врем:ЦЕЛ; УКАЗ врем:=x; x:=y; y:=врем КОН обменЦ; (****************************************************************************** * Основные математические функции ******************************************************************************) (******************************************************************************) ЗАДАЧА кв-(x:Вещ):Вещ; УКАЗ код:=0; ВОЗВРАТ x*x КОН кв; (******************************************************************************) ЗАДАЧА квкор-(x:Вещ):Вещ; УКАЗ ЕСЛИ x < 0 ТО код:=ВНЕОБЛАСТИ; ВОЗВРАТ 0 КОН; код:=0; ВОЗВРАТ Асм.квкор(x) КОН квкор; (******************************************************************************) ЗАДАЧА exp-(x:Вещ):Вещ; УКАЗ ЕСЛИ x < МИНЛН ТО код:=ОБНУЛЕНИЕ; ВОЗВРАТ 0 АЕСЛИ x > МАКСЛН ТО код:=ПЕРЕПОЛНЕНИЕ; ВОЗВРАТ МАКСВЕЩ КОН; код:=0; ВОЗВРАТ Асм.exp(x) КОН exp; (******************************************************************************) ЗАДАЧА exp2-(x:Вещ):Вещ; ПЕР xLn2:Вещ; УКАЗ xLn2:=x*ЛН2; ЕСЛИ xLn2 < МИНЛН ТО код:=ОБНУЛЕНИЕ; ВОЗВРАТ 0 АЕСЛИ xLn2 > МАКСЛН ТО код:=ПЕРЕПОЛНЕНИЕ; ВОЗВРАТ МАКСВЕЩ КОН; код:=0; ВОЗВРАТ exp(xLn2) КОН exp2; (******************************************************************************) ЗАДАЧА exp10-(x:Вещ):Вещ; ПЕР xLn10:Вещ; УКАЗ xLn10:=x*ЛН10; ЕСЛИ xLn10 < МИНЛН ТО код:=ОБНУЛЕНИЕ; ВОЗВРАТ 0 АЕСЛИ xLn10 > МАКСЛН ТО код:=ПЕРЕПОЛНЕНИЕ; ВОЗВРАТ МАКСВЕЩ КОН; код:=0; ВОЗВРАТ exp(xLn10) КОН exp10; (******************************************************************************) ЗАДАЧА ln-(x:Вещ):Вещ; УКАЗ ЕСЛИ x < 0 ТО код:=ВНЕОБЛАСТИ; ВОЗВРАТ -МАКСВЕЩ АЕСЛИ x = 0 ТО код:=ОСОБЕННОСТЬ; ВОЗВРАТ -МАКСВЕЩ КОН; код:=0; ВОЗВРАТ Асм.ln(x) КОН ln; (******************************************************************************) ЗАДАЧА log10-(x:Вещ):Вещ; УКАЗ ЕСЛИ x < 0 ТО код:=ВНЕОБЛАСТИ; ВОЗВРАТ -МАКСВЕЩ АЕСЛИ x = 0 ТО код:=ОСОБЕННОСТЬ; ВОЗВРАТ -МАКСВЕЩ КОН; код:=0; ВОЗВРАТ ln(x)/ЛН10 КОН log10; (******************************************************************************) ЗАДАЧА log2-(x:Вещ):Вещ; УКАЗ ЕСЛИ x < 0 ТО код:=ВНЕОБЛАСТИ; ВОЗВРАТ -МАКСВЕЩ АЕСЛИ x = 0 ТО код:=ОСОБЕННОСТЬ; ВОЗВРАТ -МАКСВЕЩ КОН; код:=0; ВОЗВРАТ ln(x)/ЛН2 КОН log2; (******************************************************************************) ЗАДАЧА loga-(x,a:Вещ):Вещ; ПЕР y:Вещ; УКАЗ y:=ln(x); ЕСЛИ код = 0 ТО ЕСЛИ a = 1 ТО код:=ОСОБЕННОСТЬ; y:=знак2(МАКСВЕЩ,y) ИНАЧЕ y:=y/ln(a) КОН КОН; ВОЗВРАТ y КОН loga; (****************************************************************************** * Степенные функции ******************************************************************************) (******************************************************************************) ЗАДАЧА пробаСтеп(x,y,отв+:Вещ):КЛЮЧ; (* Проверка случаев x=0, y=0 и y=1. После xy в <отв> *) УКАЗ код:=0; ЕСЛИ x = 0 ТО ЕСЛИ y = 0 ТО (* 00 = lim xx = 1 *) отв:=1 (* x->0 *) АЕСЛИ y > 0 ТО отв:=0 (* 0y = 0 *) ИНАЧЕ код:=ОСОБЕННОСТЬ; отв:=МАКСВЕЩ КОН; ВОЗВРАТ ВКЛ АЕСЛИ y = 0 ТО отв:=1; (* x0 = 1 *) ВОЗВРАТ ВКЛ АЕСЛИ y = 1 ТО отв:=x; (* x1 = x *) ВОЗВРАТ ВКЛ ИНАЧЕ ВОЗВРАТ ОТКЛ КОН КОН пробаСтеп; (******************************************************************************) ЗАДАЧА степВЦ-(x:Вещ; n:ЦЕЛ):Вещ; (* Вычисление xn с помощью умножений *) ПОСТ ОБРМАКСВЕЩ = 1/МАКСВЕЩ; ПЕР ответ:Вещ; переворот:КЛЮЧ; УКАЗ ЕСЛИ пробаСтеп(x,n,ответ) ТО ВОЗВРАТ ответ КОН; переворот:=(n < 0); ЕСЛИ 1 < МОДУЛЬ(x) ТО (* 0 ..|x| .. 1 ? *) x:=1/x; переворот:=НЕ переворот КОН; ответ:=1; n:=МОДУЛЬ(n); ПОКА 0 < n ВЫП ЕСЛИ НЕ ЧЕТ(n) ТО ответ:=ответ*x КОН; x:=кв(x); n:=n ДЕЛИТЬ 2 КОН; ЕСЛИ переворот ТО ЕСЛИ МОДУЛЬ(ответ) < ОБРМАКСВЕЩ ТО (* только сейчас переполнение *) код:=ПЕРЕПОЛНЕНИЕ; ответ:=знак2(МАКСВЕЩ,ответ) ИНАЧЕ ответ:=1/ответ КОН КОН; ВОЗВРАТ ответ КОН степВЦ; (******************************************************************************) ЗАДАЧА степВВ-(x,y:Вещ):Вещ; (* Вычисление xy = exp(y*ln(x)), для x > 0. Если |
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com
|
|