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

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

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

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


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


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Значений(метка-:ЦЕПЬ; п+:ИзФайла.ДкПотоку):ЦЕЛ;
(*
 * Цель:  1) открыть поток, содержащий проверочные данные
 *        2) найти в нем данные для заданной функции
 *        3) прочитать число проверочных значений этой функции
 * До:    <метка> - строка-метка с названием функции
 * После: <п>     - поток, открытый и установленный в начало данных
 *                  для этой функции
 * Ответ: число проверочных значений этой функции
 *)
ПЕР
  строка:ЦЕПЬ[100];
  значений:ЦЕЛ;
УКАЗ
  п:=ИзФайла.Открыть('ПроФункц.дан');
  ЕСЛИ п = ПУСТО ТО
    НаЭкран.ВсяЦепь('^Файл "ПроФункц.дан" не найден.^');
    СТОП(1) 
  КОН;
  п.цВидЗнаков:=ИзФайла.знУни;
  ПОКА НЕ ИзФайла.Конец(п) ВЫП
    ИзФайла.Строку(п,строка);
    ЕСЛИ строка = метка ТО
      значений:=ИзФайла.Цел32(п);
      ИзФайла.ПропуститьСтроку(п);
      ВОЗВРАТ значений
    КОН
  КОН;
  НаЭкран.ВсяЦепь('^В файле "ПроФункц.дан" не найдена метка: "');
  НаЭкран.ВсяЦепь(метка);
  НаЭкран.ВсяЦепь('".^');
  СТОП(1) 
КОН Значений;
 
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Факториал;
ПЕР
    п:ИзФайла.ДкПотоку;    (* поток, содержащий проверочные данные *)
  i,n:ЦЕЛ;                       (* счетчик значений и всего значений    *)
  F,Ft,оо:Вещ;        (* вычисленная функция, её табл. значение и отн. ошибка *)
        x:Вещ;                   (* аргумент функции *)
УКАЗ
  n:=Значений('Факториал',п);
  НаЭкран.ВсяЦепь('^   x,     Факториал(x),           Таблица(x),            отн. ошибка^');
  ОТ i:=1 ДО n ВЫП
     x:=ИзФайла.Вещ64(п);
    Ft:=ИзФайла.Вещ64(п);
    F:=дФункц.Факториал(x);
    оо:=(F-Ft)/Ft;
    НаЭкран.Вещ4числа(' %8.4f %23e %23e %9.1e^',x,F,Ft,оо)
  КОН;
  ИзФайла.Закрыть(п)
КОН Факториал;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА БиномКоэф;
ПЕР
    п:ИзФайла.ДкПотоку;
  i,n:ЦЕЛ;
  F,Ft,оо:Вещ;
      m,k:Вещ;
УКАЗ
  n:=Значений('Биномиальные коэффициенты',п);
  НаЭкран.ВсяЦепь('^    m,     k, БиномКоэф(m,k),   Таблица(m,k),  отн. ошибка^');
  ОТ i:=1 ДО n ВЫП
     m:=ИзФайла.Вещ64(п);
     k:=ИзФайла.Вещ64(п);
    Ft:=ИзФайла.Вещ64(п);
    F:=дФункц.БиномКоэф(m,k);
    оо:=(F-Ft)/Ft;
    НаЭкран.Вещ4числа('%5d  %5d  %14f  %14f',m,k,F,Ft);
    НаЭкран.Вещ4числа('    %9.1e^',оо,0,0,0)
  КОН;
  ИзФайла.Закрыть(п)
КОН БиномКоэф;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Г;
ПЕР
    п:ИзФайла.ДкПотоку;
  i,n:ЦЕЛ;
  F,Ft,оо:Вещ;
        x:Вещ;
УКАЗ
  n:=Значений('Г функция',п);
  НаЭкран.ВсяЦепь('^  x,      Г(x),                    Таблица(x),             отн. ошибка^');
  ОТ i:=1 ДО n ВЫП
     x:=ИзФайла.Вещ64(п);
    Ft:=ИзФайла.Вещ64(п);
    F:=дФункц.Г(x);
    оо:=(F-Ft)/Ft;
    НаЭкран.Вещ4числа('%8.4f  %23e  %23e  %9.1e^',x,F,Ft,оо)
  КОН;
  ИзФайла.Закрыть(п)
КОН Г;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА НепГ;
ПЕР
    п:ИзФайла.ДкПотоку;
  i,n:ЦЕЛ;
  F,Ft,оо:Вещ;
      a,x:Вещ;
УКАЗ
  n:=Значений('Неполная Г функция',п);
  НаЭкран.ВсяЦепь('^ a,     x,          НепГ(a,x),              Таблица(a,x),          отн. ошибка^');
  ОТ i:=1 ДО n ВЫП
     a:=ИзФайла.Вещ64(п);
     x:=ИзФайла.Вещ64(п);
    Ft:=ИзФайла.Вещ64(п);
    F:=дФункц.НепГ(a,x);
    оо:=(F-Ft)/Ft;
    НаЭкран.Вещ4числа('%5f %13.4e %23e %23e ',a,x,F,Ft);
    НаЭкран.Вещ4числа('%9.1e^',оо,0,0,0)
  КОН;
  ИзФайла.Закрыть(п)
КОН НепГ;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Бета;
ПЕР
    п:ИзФайла.ДкПотоку;
  i,n:ЦЕЛ;
  F,Ft,оо:Вещ;
      x,y:Вещ;
УКАЗ
  n:=Значений('Бета функция',п);
  НаЭкран.ВсяЦепь('^ x,    y,    Бета(x,y),               Таблица(x,y),            отн. ошибка^');
  ОТ i:=1 ДО n ВЫП
     x:=ИзФайла.Вещ64(п);
     y:=ИзФайла.Вещ64(п);
    Ft:=ИзФайла.Вещ64(п);
    F:=дФункц.Бета(x,y);
    оо:=(F-Ft)/Ft;
    НаЭкран.Вещ4числа('%5f %5f  %23e  %23e ',x,y,F,Ft);
    НаЭкран.Вещ4числа('  %9.1e^',оо,0,0,0)
  КОН;
  ИзФайла.Закрыть(п)
КОН Бета;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА НепБета;
ПЕР
    п:ИзФайла.ДкПотоку;
  i,n:ЦЕЛ;
  F,Ft,оо:Вещ;
    a,b,x:Вещ;
УКАЗ
  n:=Значений('Неполная Бета функция',п);
  НаЭкран.ВсяЦепь('^  a,    b,    x,    НепБета(a,b,x),         Таблица(a,b,x),         отн. ошибка^');
  ОТ i:=1 ДО n ВЫП
     a:=ИзФайла.Вещ64(п);
     b:=ИзФайла.Вещ64(п);
     x:=ИзФайла.Вещ64(п);
    Ft:=ИзФайла.Вещ64(п);
    F:=дФункц.НепБета(a,b,x);
    оо:=(F-Ft)/Ft;
    НаЭкран.Вещ4числа(' %5f %5f %5f  %23e',a,b,x,F);
    НаЭкран.Вещ4числа(' %23e  %9.1e^',Ft,оо,0,0)
  КОН;
  ИзФайла.Закрыть(п)
КОН НепБета;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА erf;
ПЕР
    п:ИзФайла.ДкПотоку;
  i,n:ЦЕЛ;
  F,Ft,оо:Вещ;
        x:Вещ;
УКАЗ
  n:=Значений('erf функция',п);
  НаЭкран.ВсяЦепь('^  x,      erf(x),                  Таблица(x),             отн. ошибка^');
  ОТ i:=1 ДО n ВЫП
     x:=ИзФайла.Вещ64(п);
    Ft:=ИзФайла.Вещ64(п);
    F:=дФункц.erf(x);
    оо:=(F-Ft)/Ft;
    НаЭкран.Вещ4числа('%8.4f  %23e  %23e  %9.1e^',x,F,Ft,оо)
  КОН;
  ИзФайла.Закрыть(п)
КОН erf;

(*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*)
УКАЗ
  Факториал;
  БиномКоэф;
     Г;
  НепГ;
     Бета;
  НепБета;
  erf
КОН ПроФункц.
