(*~\Глагол\Отделы\ЧисАн\64\д\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                         ОТДЕЛ ВещОселок;
(*============================================================================*
 * НАЗНАЧЕНИЕ: Библиотечная ЗАДАЧА^ Голова - Double precision Whetstone (A001)
 *     "Скорость вычислений с вещественными двойной точности на Глаголе,
 *                т.е. с плавающей точкой ("Whetstone" в сек или MIPS)":
 *  Часть  1: Простые переменные
 *  Часть  2: Переменные ряда
 *  Часть  3: Ряд, как источник при вызове задачи
 *  Часть  4: Условные переходы
 *  Часть  5: Пропущена; Часть 6: Целочисленная арифметика
 *  Часть  7: Тригонометрические функции
 *  Часть  8: Вызов задач
 *  Часть  9: Доступ к ряду
 *  Часть 10: Целочисленная арифметика
 *  Часть 11: Математические функции 
 *============================================================================*)

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

  ОС      ИЗ "..\..\..\..\Отделы\Обмен\",

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

ПОСТ
  числоПовторовЧастиЗамераValue = 100;
            числоИспытанийValue = 400;
ПЕР 
  швРядE1  :РЯД 5 ИЗ ШИРВЕЩ;
  швT,
  швT1,швT2:ШИРВЕЩ;
  J,K,L    :ЦЕЛ;

  Быстродействие_в_MIPS+:ШИРВЕЩ;


(*-оооооооооооооо- опережающие определения/заготовки задач -ооооооооооооооооо-*)


ЗАДАЧА^ ГоловаНаЭкран-;                               (* Испытание на Whetstone в MIPS =
                    средняя скорость всех тестов с ВЕЩественными в 64 разряда *)

ЗАДАЧА^ ГоловаВФайл-(выходФайл-:ВФайл.ДкПотоку);(* Испытание на Whetstone в MIPS =
                    средняя скорость всех тестов с ВЕЩественными в 64 разряда *)


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


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА PA(швРядE+:РЯД ИЗ ШИРВЕЩ);  (* Часть 3: Ряд, как источник при вызове задачи *)
ПЕР 
  J1:ЦЕЛ;
УКАЗ
  J1:=0;
  ПОВТОРЯТЬ
    швРядE[1]:=( швРядE[1]+швРядE[2]+швРядE[3]-швРядE[4])*швT;
    швРядE[2]:=( швРядE[1]+швРядE[2]-швРядE[3]+швРядE[4])*швT;
    швРядE[3]:=( швРядE[1]-швРядE[2]+швРядE[3]+швРядE[4])*швT;
    швРядE[4]:=(-швРядE[1]+швРядE[2]+швРядE[3]+швРядE[4])/швT2;
    J1:=J1+1
  ДО J1 >= 6
КОН PA;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА P0;                    (* Часть  9: Доступ к ряду *)
УКАЗ
  швРядE1[J]:=швРядE1[K]; 
  швРядE1[K]:=швРядE1[L]; 
  швРядE1[L]:=швРядE1[J]
КОН P0;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА P3(швX,швY,швZ+:ШИРВЕЩ);     (* Часть 8: Вызов задач *)
ПЕР 
  швX1,швY1:ШИРВЕЩ;
УКАЗ
  швX1:=швX;
  швY1:=швY;
  швX1:=швT*(швX1+швY1);
  швY1:=швT*(швX1+швY1);
  швZ:=(швX1+швY1)/швT2
КОН P3;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА POUT(N,J,K:ЦЕЛ; швX1,швX2,швX3,швX4:ШИРВЕЩ);        (* вызов пустой задачи с параметрами *)
УКАЗ
  швX1:=швX2;
КОН POUT;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ЗамерыВремениПоВсемЗадачам;                              (* все замеры *)
ПЕР 
  N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11:ЦЕЛ;
  числоПовторовЧастиЗамера,I,
  числоИспытаний,          JJ:ЦЕЛ;
  швX,швY,швZ,
  швX1,швX2,швX3,швX4:ШИРВЕЩ;
УКАЗ
(* замер начинается здесь *)
  швT :=0.499975;
  швT1:=0.50025;
  швT2:=2.0;
  числоПовторовЧастиЗамера  :=числоПовторовЧастиЗамераValue;
              числоИспытаний:=числоИспытанийValue;
  ОТ JJ:=1 ДО числоИспытаний ВЫП
(* установим соответствующее число повторов каждой части замера. *)
    N1:=0;
    N2:=12 *числоПовторовЧастиЗамера;
    N3:=14 *числоПовторовЧастиЗамера;
    N4:=345*числоПовторовЧастиЗамера;
    N5:=0;
    N6:=210*числоПовторовЧастиЗамера;
    N7:=32 *числоПовторовЧастиЗамера;
    N8:=899*числоПовторовЧастиЗамера;
    N9:=616*числоПовторовЧастиЗамера;
    N10:=0;
    N11:=93*числоПовторовЧастиЗамера;
(* Часть 1: Простые переменные *)
    швX1:= 1.0;
    швX2:=-1.0;
    швX3:=-1.0;
    швX4:=-1.0;
    ОТ I:=1 ДО N1 ВЫП 
      швX1:=( швX1+швX2+швX3-швX4)*швT;
      швX2:=( швX1+швX2-швX3+швX4)*швT;
      швX3:=( швX1-швX2+швX3+швX4)*швT;
      швX4:=(-швX1+швX2+швX3+швX4)*швT;
    КОН;
    ЕСЛИ JJ = числоИспытаний ТО               (* последний повтор цикла *)
      POUT(N1,N1,N1,швX1,швX2,швX3,швX4)  (* вызов пустой задачи с параметрами *)
    КОН;
(* Часть 2: Переменные ряда *)
    швРядE1[1]:= 1.0;
    швРядE1[2]:=-1.0;
    швРядE1[3]:=-1.0;
    швРядE1[4]:=-1.0;
    ОТ I:=1 ДО N2 ВЫП
      швРядE1[1]:=( швРядE1[1]+швРядE1[2]+швРядE1[3]-швРядE1[4])*швT;
      швРядE1[2]:=( швРядE1[1]+швРядE1[2]-швРядE1[3]+швРядE1[4])*швT;
      швРядE1[3]:=( швРядE1[1]-швРядE1[2]+швРядE1[3]+швРядE1[4])*швT;
      швРядE1[4]:=(-швРядE1[1]+швРядE1[2]+швРядE1[3]+швРядE1[4])*швT
    КОН;
    ЕСЛИ JJ = числоИспытаний ТО                          (* последний повтор цикла *)
      POUT(N2,N3,N2,швРядE1[1],швРядE1[2],швРядE1[3],швРядE1[4])  (* вызов пустой задачи с параметрами *)
    КОН;
(* Часть 3: Ряд, как источник при вызове задачи *)
    ОТ I:=1 ДО N3 ВЫП
      PA(швРядE1)                      (* вызов задачи *)
    КОН;
    ЕСЛИ JJ = числоИспытаний ТО                          (* последний повтор цикла *)
      POUT(N3,N2,N2,швРядE1[1],швРядE1[2],швРядE1[3],швРядE1[4])  (* вызов пустой задачи *)
    КОН;
(* Часть 4: Условные переходы *)
    J:=1;
    ОТ I:=1 ДО N4 ВЫП
      ЕСЛИ J #  1 ТО J:=3 ИНАЧЕ J:=2 КОН;
      ЕСЛИ J <= 2 ТО J:=1 ИНАЧЕ J:=0 КОН;
      ЕСЛИ J >= 1 ТО J:=0 ИНАЧЕ J:=1 КОН
    КОН;
    ЕСЛИ JJ = числоИспытаний ТО                          (* последний повтор цикла *)
      POUT(N4,J,J,швX1,швX2,швX3,швX4)                (* вызов пустой задачи *)
    КОН;
(* Часть 5: Пропущена; Часть 6: Целочисленная арифметика *)
    J:=1;
    K:=2;
    L:=3;
    ОТ I:=1 ДО N6 ВЫП
      J:=J*(K-J)*(L-K);
      K:=L*K-(L-J)*K;
      L:=(L-K)*(K+J);
      швРядE1[L-1]:=(J+K+L);
      швРядE1[K-1]:=(J*K*L)
    КОН;
    ЕСЛИ JJ = числоИспытаний ТО                          (* последний повтор цикла *)
      POUT(N6,J,K,швРядE1[1],швРядE1[2],швРядE1[3],швРядE1[4])   (* вызов пустой задачи *)
    КОН;
(* Часть 7: Тригонометрические функции *)
    швX:=0.5;
    швY:=0.5;
    ОТ I:=1 ДО N7 ВЫП
      швX:=швT*дМатем.arctg(швT2*дМатем.sin(швX)*дМатем.cos(швX)/(дМатем.cos(швX+швY)+дМатем.cos(швX-швY)-1.0));
      швY:=швT*дМатем.arctg(швT2*дМатем.sin(швY)*дМатем.cos(швY)/(дМатем.cos(швX+швY)+дМатем.cos(швX-швY)-1.0))
    КОН;
    ЕСЛИ JJ = числоИспытаний ТО                          (* последний повтор цикла *)
      POUT(N7,J,K,швX,швX,швY,швY)                   (* вызов пустой задачи *)
    КОН;
(* Часть 8: Вызов задач *)
    швX:=1.0;
    швY:=1.0;
    швZ:=1.0;
    ОТ I:=1 ДО N8 ВЫП
      P3(швX,швY,швZ)                   (* вызов задачи *)
    КОН;
    ЕСЛИ JJ = числоИспытаний ТО                          (* последний повтор цикла *)
      POUT(N8,J,K,швX,швY,швZ,швZ)                   (* вызов пустой задачи *)
    КОН;
(* Часть 9: Доступ к ряду *)
    J:=1;
    K:=2;
    L:=3;
    швРядE1[1]:=1.0;
    швРядE1[2]:=2.0;
    швРядE1[3]:=3.0;
    ОТ I:=1 ДО N9 ВЫП
      P0                          (* вызов задачи *)
    КОН;
    ЕСЛИ JJ = числоИспытаний ТО                          (* последний повтор цикла *)
      POUT(N9,J,K,швРядE1[1],швРядE1[2],швРядE1[3],швРядE1[4])   (* вызов пустой задачи *)
    КОН;
(* Часть 10: Целочисленная арифметика *)
    J:=2;
    K:=3;
    ОТ I:=1 ДО N10 ВЫП
      J:=J+K;
      K:=J+K;
      J:=K-J;
      K:=K-J-J
    КОН;
    ЕСЛИ JJ = числоИспытаний ТО                          (* последний повтор цикла *)
      POUT(N10,J,K,швX1,швX2,швX3,швX4)              (* вызов пустой задачи *)
    КОН;
(* Часть 11: Математические функции (квкор, exp, ln) *)
    швX:=0.75;
    ОТ I:=1 ДО N11 ВЫП
      швX:=дМатем.квкор(дМатем.exp(дМатем.ln(швX)/швT1))
    КОН;
    ЕСЛИ JJ = числоИспытаний ТО                          (* последний повтор цикла *)
      POUT(N11,J,K,швX,швX,швX,швX)                  (* вызов пустой задачи *)
    КОН
  КОН
КОН ЗамерыВремениПоВсемЗадачам;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ГоловаНаЭкран-;                                (* Испытание на Whetstone в MIPS =
                    средняя скорость всех тестов с ВЕЩественными в 64 разряда *)
ПЕР 
  начВремя,
  конВремя :ЦЕЛ;
УКАЗ
  НаЭкран.ВсяЦепь("^Испытание на Whetstone = испытаний в сек. ^(средняя скорость всех тестов с ВЕЩественными в 64 разряда)");
                                                        начВремя:=ОС.Время();
  ЗамерыВремениПоВсемЗадачам;
                                                        конВремя:=ОС.Время()-начВремя;
  Быстродействие_в_MIPS
                        :=
     числоПовторовЧастиЗамераValue*числоИспытанийValue/(конВремя/1000);

  НаЭкран.Вещ4числа(" = %f MIPS^(чем больше, тем лучше)^",
                          Быстродействие_в_MIPS,0,0,0)
КОН ГоловаНаЭкран;                             (* повторы*испытания *) (* сек *)

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ГоловаВФайл-(выходФайл-:ВФайл.ДкПотоку);(* Испытание на Whetstone в MIPS =
                    средняя скорость всех тестов с ВЕЩественными в 64 разряда *)
ПЕР 
  начВремя,
  конВремя :ЦЕЛ;
УКАЗ
  ВФайл.ЦепьЗнаков(выходФайл,"^Испытание на Whetstone = испытаний в сек. ^(средняя скорость всех тестов с ВЕЩественными в 64 разряда)");
                                                        начВремя:=ОС.Время();
  ЗамерыВремениПоВсемЗадачам;
                                                        конВремя:=ОС.Время()-начВремя;
  Быстродействие_в_MIPS
                        :=
     числоПовторовЧастиЗамераValue*числоИспытанийValue/(конВремя/1000);

  ВФайл.Вещ4числа(выходФайл," = %f MIPS^(чем больше, тем лучше)^",
                                   Быстродействие_в_MIPS,0,0,0)
КОН ГоловаВФайл;                               (* повторы*испытания *) (* сек *)

(*-ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss-*)
УКАЗ
КОН ВещОселок.
