|
(******************************************************************************)
(**) ОТДЕЛ Матем;
(******************************************************************************
* НАЗНАЧЕНИЕ: основные математические функции
******************************************************************************
* ПРИМЕЧАНИЯ: после вызова задачи переменная <Матем.код> может стать # 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. Если целый, то степВЦ() *)
ПЕР
отв:Вещ;
УКАЗ
ЕСЛИ пробаСтеп(x,y,отв)
ТО
ВОЗВРАТ отв
АЕСЛИ (МОДУЛЬ(y) <= МАКС(ЦЕЛ)) И (ЦЕЛЧАСТЬ(y) = y)
ТО (* целый показатель *)
ВОЗВРАТ степВЦ(x,УЗК(ВШИРЦЕЛ(y)))
АЕСЛИ x <= 0
ТО
код:=ВНЕОБЛАСТИ;
ВОЗВРАТ 0
КОН;
ВОЗВРАТ exp(y*ln(x))
КОН степВВ;
(******************************************************************************)
ЗАДАЧА Пифагор-(x,y:Вещ):Вещ;
(* Вычисление квкор(x2+y2) без разрушения при переполнении и недополнении *)
ПЕР
modX,modY:Вещ;
УКАЗ
код:=0;
modX:=МОДУЛЬ(x);
modY:=МОДУЛЬ(y);
ЕСЛИ modX > modY ТО
ВОЗВРАТ modX*квкор(1+кв(modY/modX))
АЕСЛИ modY = 0 ТО
ВОЗВРАТ 0
КОН;
ВОЗВРАТ modY*квкор(1+кв(modX/modY))
КОН Пифагор;
(******************************************************************************
* Тригонометрические функции
******************************************************************************)
(******************************************************************************)
ЗАДАЧА уголВПи-(тета:Вещ):Вещ;
УКАЗ
код:=0;
ПОКА тета > ПИ ВЫП
тета:=тета-ПИ2
КОН;
ПОКА тета <=-ПИ ВЫП
тета:=тета+ПИ2
КОН;
ВОЗВРАТ тета
КОН уголВПи;
(******************************************************************************)
ЗАДАЧА sin-(x:Вещ):Вещ;
УКАЗ
код:=0;
ВОЗВРАТ Асм.sin(x)
КОН sin;
(******************************************************************************)
ЗАДАЧА cos-(x:Вещ):Вещ;
УКАЗ
код:=0;
ВОЗВРАТ Асм.cos(x)
КОН cos;
(******************************************************************************)
ЗАДАЧА sincos-(x,sinX+,cosX+:Вещ);
УКАЗ
код:=0;
Асм.sincos(x,sinX,cosX)
КОН sincos;
(******************************************************************************)
ЗАДАЧА arctg-(x:Вещ):Вещ;
УКАЗ
код:=0;
ВОЗВРАТ Асм.arctg(x)
КОН arctg;
(******************************************************************************)
ЗАДАЧА tg-(x:Вещ):Вещ;
ПЕР
sinX,cosX:Вещ;
УКАЗ
sincos(x,sinX,cosX);
ЕСЛИ cosX = 0 ТО
код:=ОСОБЕННОСТЬ;
ВОЗВРАТ знак2(МАКСВЕЩ,sinX)
КОН;
ВОЗВРАТ sinX/cosX
КОН tg;
(******************************************************************************)
ЗАДАЧА arcsin-(x:Вещ):Вещ;
ПЕР
modX:Вещ;
УКАЗ
modX:=МОДУЛЬ(x);
ЕСЛИ modX > 1 ТО
код:=ВНЕОБЛАСТИ;
ВОЗВРАТ знак2(ПИ/2,x)
АЕСЛИ modX = 1 ТО
код:=0;
ВОЗВРАТ знак2(ПИ/2,x)
КОН;
ВОЗВРАТ arctg(x/квкор(1-кв(x)))
КОН arcsin;
(******************************************************************************)
ЗАДАЧА arccos-(x:Вещ):Вещ;
УКАЗ
код:=0;
ЕСЛИ x < -1 ТО
код:=ВНЕОБЛАСТИ;
ВОЗВРАТ ПИ
АЕСЛИ x > 1 ТО
код:=ВНЕОБЛАСТИ;
ВОЗВРАТ 0
АЕСЛИ x = 1 ТО
ВОЗВРАТ 0
АЕСЛИ x = -1 ТО
ВОЗВРАТ ПИ
КОН;
ВОЗВРАТ ПИ/2-arctg(x/квкор(1-кв(x)))
КОН arccos;
(******************************************************************************)
ЗАДАЧА arctg2-(y,x:Вещ):Вещ;
ПЕР
тета:Вещ;
УКАЗ
код:=0;
ЕСЛИ x = 0 ТО
ЕСЛИ y = 0 ТО
ВОЗВРАТ 0
АЕСЛИ y > 0 ТО
ВОЗВРАТ ПИ/2
ИНАЧЕ
ВОЗВРАТ -ПИ/2
КОН
ИНАЧЕ
(* -ПИ/2..ПИ/2 *)
тета:=arctg(y/x);
(* II-III квадранты *)
ЕСЛИ x < 0 ТО
ЕСЛИ y >= 0 ТО
тета:=тета+ПИ (* ПИ/2..ПИ *)
ИНАЧЕ
тета:=тета-ПИ
КОН
КОН; (* -ПИ..-ПИ/2 *)
ВОЗВРАТ тета;
КОН
КОН arctg2;
(******************************************************************************
* Гиперболические функции
******************************************************************************)
(******************************************************************************)
ЗАДАЧА sh-(x:Вещ):Вещ;
ПЕР
expX:Вещ;
УКАЗ
ЕСЛИ (x < МИНЛН) ИЛИ (x > МАКСЛН) ТО
код:=ПЕРЕПОЛНЕНИЕ;
ВОЗВРАТ знак2(МАКСВЕЩ,x)
КОН;
expX:=exp(x);
ВОЗВРАТ 0.5*(expX-1/expX)
КОН sh;
(******************************************************************************)
ЗАДАЧА ch-(x:Вещ):Вещ;
ПЕР
expX:Вещ;
УКАЗ
ЕСЛИ (x < МИНЛН) ИЛИ (x > МАКСЛН) ТО
код:=ПЕРЕПОЛНЕНИЕ;
ВОЗВРАТ МАКСВЕЩ
КОН;
expX:=exp(x);
ВОЗВРАТ 0.5*(expX+1/expX)
КОН ch;
(******************************************************************************)
ЗАДАЧА shch-(x:Вещ; shX+,chX+:Вещ);
ПЕР
expX,expMinusX:Вещ;
УКАЗ
ЕСЛИ (x < МИНЛН) ИЛИ (x > МАКСЛН) ТО
код:=ПЕРЕПОЛНЕНИЕ;
chX:=МАКСВЕЩ;
shX:=знак2(chX,x)
ИНАЧЕ
expX:=exp(x);
expMinusX:=1/expX;
shX:=0.5*(expX-expMinusX);
chX:=0.5*(expX+expMinusX)
КОН
КОН shch;
(******************************************************************************)
ЗАДАЧА th-(x:Вещ):Вещ;
ПЕР
shX,chX:Вещ;
УКАЗ
shch(x,shX,chX);
ВОЗВРАТ shX/chX;
КОН th;
(******************************************************************************)
ЗАДАЧА Arsh-(x:Вещ):Вещ;
УКАЗ
ВОЗВРАТ ln(x+квкор(кв(x)+1))
КОН Arsh;
(******************************************************************************)
ЗАДАЧА Arch-(x:Вещ):Вещ;
УКАЗ
ЕСЛИ x < 1 ТО
код:=ВНЕОБЛАСТИ;
ВОЗВРАТ 0
КОН;
ВОЗВРАТ ln(x+квкор(кв(x)-1))
КОН Arch;
(******************************************************************************)
ЗАДАЧА Arth-(x:Вещ):Вещ;
УКАЗ
ЕСЛИ (x <-1) ИЛИ (x > 1) ТО
код:=ВНЕОБЛАСТИ;
ВОЗВРАТ знак2(МАКСВЕЩ,x)
АЕСЛИ (x =-1) ИЛИ (x = 1) ТО
код:=ОСОБЕННОСТЬ;
ВОЗВРАТ знак2(МАКСВЕЩ,x)
КОН;
ВОЗВРАТ 0.5*ln((1+x)/(1-x))
КОН Arth;
(******************************************************************************
* Источники случайных чисел
******************************************************************************)
(******************************************************************************)
ЗАДАЧА случ0-(случ:ЦЕЛ);
(* Выставка источника случайных чисел в начальное состояние *)
УКАЗ
Асм.СлучНач(случ)
КОН случ0;
(******************************************************************************)
ЗАДАЧА случЦ-():ЦЕЛ;
(* Возвращает целые случайные числа из интервала [-2147483648; 2147483647] *)
УКАЗ
ВОЗВРАТ Асм.СлучЦел()
КОН случЦ;
(******************************************************************************)
ЗАДАЧА случ-():Вещ;
(* Возвращает вещественные случайные числа из интервала [0; 1), т.е. < 1 *)
ПОСТ
вминус32=1/4294967296; (* 2-32 *)
УКАЗ
ВОЗВРАТ Асм.СлучЦел()*вминус32+0.5;
КОН случ;
(******************************************************************************)
ЗАДАЧА случСГ-():Вещ;
(* Возвращает вещественные случайные числа, распределенные по стандартному
* Гауссу (мю=0,сигма=1) *)
ПЕР
r,тета,sin,cos:Вещ;
УКАЗ
ЕСЛИ НЕ впГаусс ТО
r:=квкор(-2*ln(случ()));
тета:=ПИ2*случ();
sincos(тета,sin,cos);
пГаусс:=r*sin; (* сохраним одно число *)
впГаусс:=ВКЛ;
ВОЗВРАТ r*cos (* возвратим другое число *)
КОН;
впГаусс:=ОТКЛ;
ВОЗВРАТ пГаусс (* возвратим сохраненное число *)
КОН случСГ;
(******************************************************************************)
ЗАДАЧА случГ-(мю,сигма:Вещ):Вещ;
(* Возвращает вещественные случайные числа, распределенные по Гауссу *)
УКАЗ
ВОЗВРАТ мю+сигма*случСГ()
КОН случГ;
(******************************************************************************)
УКАЗ
код:=0;
впГаусс:=ОТКЛ;
случ0(ОС.Время())
КОН Матем.
|
|