(*~\Глагол\ПриложенияЧисАн\64\к\Пара\МатФункции\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                                 ОТДЕЛ ПроМатем1+;
(*============================================================================*
 * НАЗНАЧЕНИЕ:
 *    Приложение "Проверка точности вычислений трансцендентных функций"
 *                          комплексные числа в виде набора.
 * ПРИМЕЧАНИЯ: 
 *     Для каждого типа функции выбирается 20 случайных возрастающих
 *  значений аргумента. Далее для каждого значения вычисляется прямая функция,
 *  а к результатам применяется обратная функция. Потом вычисляется
 *  относительная ошибка результатов и первоначальных значений аргумента.
 *============================================================================*)

ИСПОЛЬЗУЕТ
 дМатем   ИЗ "..\..\..\..\..\Отделы\ЧисАн\64\д\",
(*
  Вектор  ИЗ "..\..\..\..\..\Отделы\ЧисАн\64\д\",
  Матрица ИЗ "..\..\..\..\..\Отделы\ЧисАн\64\д\",

кпМатем   ИЗ "..\..\..\..\..\Отделы\ЧисАн\64\к\Пара\",

кпМатрица ИЗ "..\..\..\..\..\Отделы\ЧисАн\64\к\Пара\",

кпМатрВВ  ИЗ "..\..\..\..\..\Отделы\ЧисАн\64\к\Пара\ВводВывод\",
кпВектВВ  ИЗ "..\..\..\..\..\Отделы\ЧисАн\64\к\Пара\ВводВывод\",

  ИзФайла ИЗ "..\..\..\..\..\Отделы\Обмен\ВводВывод\",
*)
  НаЭкран ИЗ "..\..\..\..\..\Отделы\Обмен\ВводВывод\";

ПОСТ
  АРГУМЕНТОВ = 20; (* число аргументов *)

ВИД
        (* вид Вещ - это удвоенная точность 64 разряда (16 десятичных знаков) *)
  Вещ = дМатем.Вещ;                   (* локально *)

  Функция = ЗАДАЧА(x:Вещ):Вещ;

  дВЕКТ   = РЯД АРГУМЕНТОВ+1 ИЗ Вещ;


(*=рррррррррррррррррррррррр= реализация задач =рррррррррррррррррррррррррррррр=*)


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА СлучАрг(x+:дВЕКТ; от,до:Вещ);
(*
 * Заполняет вектор аргументов случайными числами от <от> до <до>,
 * округляет до 4-го знака после запятой и располагает в возрастающем порядке
 *)
ПЕР
  i,j,k:ЦЕЛ;
  a:Вещ;
УКАЗ
  ОТ i:=1 ДО АРГУМЕНТОВ ВЫП
    a:=(до-от)*дМатем.случ()+от;
    ЕСЛИ МОДУЛЬ(a) < 1.D-4 ТО
      a:=дМатем.знакЧ(a)*1.D-4
    КОН;
    x[i]:=ВШИРЦЕЛ(10000*a)/10000;
  КОН;
  (* Сортировка вставками *)
  ОТ i:=1 ДО АРГУМЕНТОВ-1 ВЫП
    k:=i;
    a:=x[i];
    ОТ j:=i+1 ДО АРГУМЕНТОВ ВЫП
      ЕСЛИ x[j] < a ТО
        k:=j;
        a:=x[j]
      КОН 
    КОН;
    дМатем.обмен(x[i],x[k])
  КОН
КОН СлучАрг;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Оборот(прямИмя-,обрИмя-:ЦЕПЬ; прямФ,обрФ:Функция; от,до:Вещ);
ПЕР
  i:ЦЕЛ;
  x0:дВЕКТ;  (* из АРГУМЕНТОВ=20+1 *)
  y,x1,оо:Вещ;
УКАЗ
  НаЭкран.ВсяЦепь('^ x0,     y = ');
  НаЭкран.ВсяЦепь(прямИмя);
  НаЭкран.ВсяЦепь('(x0),           x1 = ');
  НаЭкран.ВсяЦепь(обрИмя);
  НаЭкран.ВсяЦепь('(y),             отн. ошибка^');

  СлучАрг(x0,от,до);

  ОТ i:=1 ДО АРГУМЕНТОВ ВЫП
    y:=прямФ(x0[i]);
    x1:=обрФ(y);
    оо:=(x0[i]-x1)/x0[i];
    НаЭкран.Вещ4числа('%8.4f %23e %23e %15.4e^',x0[i],y,x1,оо)
  КОН
КОН Оборот;

(*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*)
УКАЗ
  Оборот('exp'  ,'ln'    ,дМатем.exp  ,дМатем.ln    ,        -10,          10);
  Оборот('exp10','log10' ,дМатем.exp10,дМатем.log10 ,         -5,           5);
  Оборот('exp2' ,'log2'  ,дМатем.exp2 ,дМатем.log2  ,        -15,          15);
  Оборот('sin'  ,'arcsin',дМатем.sin  ,дМатем.arcsin,-дМатем.ПолПИ,дМатем.ПолПИ);
  Оборот('cos'  ,'arccos',дМатем.cos  ,дМатем.arccos,          0,    дМатем.ПИ);
  Оборот('tg'   ,'tg'    ,дМатем.tg   ,дМатем.arctg ,-дМатем.ПолПИ,дМатем.ПолПИ);
  Оборот('sh'   ,'sh'    ,дМатем.sh   ,дМатем.Arsh  ,          0,           5);
  Оборот('ch'   ,'ch'    ,дМатем.ch   ,дМатем.Arch  ,          0,           5);
  Оборот('th'   ,'th'    ,дМатем.th   ,дМатем.Arth  ,         -5,           5);
КОН ПроМатем1.
