home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / math / cwaite.tst < prev    next >
Encoding:
Text File  |  1988-05-03  |  104.4 KB  |  3,193 lines

  1.  
  2. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3. --TESTMATH
  4. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  5.  
  6.  
  7. with Text_Io;
  8. with Generic_Math_Functions;
  9. procedure Test_Math_Functions is
  10.     type Floating is new Float;
  11. --  type Floating is new Long_Float;                  --    Alternatively
  12.     package Integer_Io is new Text_Io.Integer_Io (Integer);
  13.     package Floating_Io is new Text_Io.Float_Io (Floating);
  14.     package Boolean_Io is new Text_Io.Enumeration_Io (Boolean);
  15.     use Text_Io;
  16.     use Integer_Io;
  17.     use Floating_Io;
  18.     use Boolean_Io;
  19.     package Math_Functions is new Generic_Math_Functions (Floating);
  20.     use Math_Functions;
  21.     Output : File_Type;
  22. --  ########### S Y S T E M    D E P E N D E N C I E S  ############
  23.     Output_File_Name         : constant String := 
  24.                              "math_test.out;";
  25.     Test_Error_Log_File_Name : constant String := 
  26.                              "math_test.out;";
  27. --  ################################################################
  28.     One : constant Floating := Floating (1.0);
  29.     Zero : constant Floating := One - One;
  30.     Half : constant Floating := One / (One + One);
  31.     Ibeta : Integer;
  32. --  The radix of the floating-point representation
  33.     It : Integer;
  34. --  The number of base IBETA digits in the floating significand
  35.     Irnd : Integer;
  36. --  TRUE (1) if floating addition rounds, FALSE (0) if truncates
  37.     Ngrd : Integer;
  38. --  Number of guard digits for multiplication
  39.     Machep : Integer;
  40. --  The largest negative integer such that
  41. --    1.0 + floating(IBETA) ** MACHEP /= 1.0
  42. --  except that MACHEP is bounded below by -(IT + 3)
  43.     Negep : Integer;
  44. --  The largest negative integer such that
  45. --    1.0 -0 floating(IBETA) ** NEGEP /= 1.0
  46. --  except that NEGEP is bounded below by -(IT + 3)
  47.     Iexp : Integer;
  48. --  The number of bits (decimal places if IBETA = 10)
  49. --  reserved for the representation of the exponent (including
  50. --  the bias or sign) of a floating-point number
  51.     Minexp : Integer;
  52. --  The largest in magnitude negative integer such that
  53. --  floating(IBETA) ** MINEXP is a positive floating-point number
  54.     Maxexp : Integer;
  55. --  The largest positive exponent for a finite floating-point number
  56.     Eps : Floating;
  57. --  The smallest positive floating-point number such that
  58. --                              1.0 + EPS /= 1.0
  59. --  In particular, if IBETA = 2 or IRND = 0,
  60. --  EPS = floating(IBETA) ** MACHEP
  61. --  Otherwise, EPS = (floating(IBETA) ** MACHEP) / 2
  62.     Epsneg : Floating;
  63. --  A small positive floating-poin number such that 1.0-EPSNEG /= 1.0
  64.     Xmin : Floating;
  65. --  The smallest non-vanishing floating-point power of the radix
  66. --  In particular, XMIN = floating(IBETA) ** MINEXP
  67.     Xmax : Floating;
  68. --  The largest finite floating-point number
  69.     procedure Machar is
  70. --  This initialization is the MACHAR routine of Cody and Waite Appendix B.
  71.         A, B, Y, Z           : Floating;
  72.         I, K, Mx, Iz         : Integer;
  73.         Beta, Betam1, Betain : Floating;
  74.     begin
  75.         A := One;
  76.         while (((A + One) - A) - One) = Zero loop
  77.             A := A + A;
  78.         end loop;
  79.         B := One;
  80.         while ((A + B) - A) = Zero loop
  81.             B := B + B;
  82.         end loop;
  83.         Ibeta := Integer ((A + B) - A);
  84.         Beta  := Floating (Ibeta);
  85.         It    := 0;
  86.         B     := One;
  87.         while (((B + One) - B) - One) = Zero loop
  88.             It := It + 1;
  89.             B  := B * Beta;
  90.         end loop;
  91.         Irnd   := 0;
  92.         Betam1 := Beta - One;
  93.         if ((A + Betam1) - A) /= Zero then
  94.             Irnd := 1;
  95.         end if;
  96.         Negep  := It + 3;
  97.         Betain := One / Beta;
  98.         A      := One;
  99.         for I in 1..Negep loop
  100.             exit when I > Negep;
  101.             A := A * Betain;
  102.         end loop;
  103.         B := A;
  104.         while ((One - A) - One) = Zero loop
  105.             A     := A * Beta;
  106.             Negep := Negep - 1;
  107.         end loop;
  108.         Negep  := - Negep;
  109.         Epsneg := A;
  110.         if (Ibeta /= 2) and (Irnd /= 0) then
  111.             A := (A * (One + A)) / (One + One);
  112.             if ((One - A) - One) /= Zero then
  113.                 Epsneg := A;
  114.             end if;
  115.         end if;
  116.         Machep := - It - 3;
  117.         A      := B;
  118.         while ((One + A) - One) = Zero loop
  119.             A      := A * Beta;
  120.             Machep := Machep + 1;
  121.         end loop;
  122.         Eps := A;
  123.         if (Ibeta /= 2) and (Irnd /= 0) then
  124.             A := (A * (One + A)) / (One + One);
  125.             if ((One + A) - One) /= Zero then
  126.                 Eps := A;
  127.             end if;
  128.         end if;
  129.         Ngrd := 0;
  130.         if ((Irnd = 0) and ((One + Eps) * One - One) /= Zero) then
  131.             Ngrd := 1;
  132.         end if;
  133.         Find_Iexp: 
  134.             declare
  135.                 Y : Floating := 1.0;
  136.                 A : Floating := Betain;
  137.                 I : Integer := 0;
  138.             begin
  139.                 loop
  140.                     Y := A * A;
  141.                     exit when Y = 0.0;
  142.                     I := I + 1;
  143.                     A := Y;
  144.                 end loop;
  145.                 Iexp := I;
  146.             end Find_Iexp;
  147.         Find_Smallest: 
  148.             declare
  149.                 A, Y : Floating := 1.0;
  150.                 I    : Integer := 0;
  151.             begin
  152.                 loop
  153.                     Y := A / Beta;
  154.                     exit when Y = 0.0;
  155.                     I := I - 1;
  156.                     A := Y;
  157.                 end loop;
  158.                 Minexp := I;
  159.                 Xmin   := A;
  160.             end Find_Smallest;
  161.         Find_Largest: 
  162.             declare
  163.                 A, Y : Floating := 1.0;
  164.                 I    : Integer := 1;
  165.             begin
  166.                 loop
  167.                     Y := A * Beta;
  168.                     I := I + 1;
  169.                     A := Y;
  170.                 end loop;
  171.             exception
  172.                 when others => 
  173.                     Maxexp := I;
  174.                     Xmax   := A * ((1.0 - Epsneg) * Beta);
  175.             end Find_Largest;
  176.         New_Page;
  177.         New_Line;
  178.         Put ("IBETA     ");
  179.         Put (Ibeta);
  180.         Put ("              MACHINE_RADIX     ");
  181.         Put (Float'Machine_Radix);
  182.         New_Line;
  183.         Put ("IT        ");
  184.         Put (It);
  185.         Put ("              MACHINE_MANTISSA  ");
  186.         Put (Floating'Base'Machine_Mantissa);
  187.         New_Line;
  188.         Put ("IRND      ");
  189.         Put (Irnd);
  190.         Put ("              MACHINE_ROUNDS          ");
  191.         Put (Floating'Base'Machine_Rounds);
  192.         New_Line;
  193.         Put ("NEGEP     ");
  194.         Put (Negep);
  195.         New_Line;
  196.         Put ("EPSNEG    ");
  197.         Put (Epsneg);
  198.         New_Line;
  199.         Put ("MACHEP    ");
  200.         Put (Machep);
  201.         New_Line;
  202.         Put ("EPS       ");
  203.         Put (Eps);
  204.         Put ("    EPSILON           ");
  205.         Put (Float'Epsilon);
  206.         New_Line;
  207.         Put ("NGRD      ");
  208.         Put (Ngrd);
  209.         New_Line;
  210.         Put ("IEXP      ");
  211.         Put (Iexp);
  212.         New_Line;
  213.         Put ("MINEXP    ");
  214.         Put (Minexp);
  215.         Put ("              MACHINE_EMIN      ");
  216.         Put (Floating'Base'Machine_Emin);
  217.         New_Line;
  218.         Put ("XMIN      ");
  219.         Put (Xmin);
  220.         New_Line;
  221.         Put ("MAXEXP    ");
  222.         Put (Maxexp);
  223.         Put ("              MACHINE_EMAX      ");
  224.         Put (Floating'Base'Machine_Emax);
  225.         New_Line;
  226.         Put ("XMAX      ");
  227.         Put (Xmax);
  228.         Put ("   LAST               ");
  229.         Put (Floating'Base'Last);
  230.         New_Line;
  231.         New_Page;
  232.     end Machar;
  233.  
  234.     Procedure Test_Sqrt is separate;
  235.     Procedure Test_Cbrt is separate;
  236.     Procedure Test_Log is separate;
  237.     Procedure Test_Exp is separate;
  238.     Procedure Test_Power is separate;
  239.     Procedure Test_Sin_Cos is separate;
  240.     Procedure Test_Tan_Cot is separate;
  241.     Procedure Test_Asin_Acos is separate;
  242.     Procedure Test_Atan is separate;
  243.     Procedure Test_Sinh_Cosh is separate;
  244.     Procedure Test_Tanh is separate;
  245.  
  246. begin
  247.     Create (Output, Out_File, Output_File_Name);
  248.     Set_Output (Output);
  249.     What_To_Do_When_There_Is_An_Error := Return_Default_And_Log;
  250.     if Is_Open (Error_Log) then
  251.         Delete (Error_Log);
  252.     end if;
  253.     Create (Error_Log, Out_File, Test_Error_Log_File_Name);
  254.     Machar;
  255.     Test_Sqrt;
  256.     Test_Cbrt;
  257.     Test_Log;
  258.     Test_Exp;
  259.     Test_Power;
  260.     Test_Sin_Cos;
  261.     Test_Tan_Cot;
  262.     Test_Asin_Acos;
  263.     Test_Atan;
  264.     Test_Sinh_Cosh;
  265.     Test_Tanh;
  266.     Close (Output);
  267.     Close (Error_Log);
  268. end Test_Math_Functions;
  269.  
  270. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  271. --TESTSQRT
  272. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  273.     separate (Test_Math_Functions)
  274.     procedure Test_Sqrt is
  275.         use Text_Io;
  276.         use Integer_Io, Floating_Io;
  277.         use Math_Functions;
  278.         N          : Integer := 2000;
  279.         K1, K2, K3 : Integer;
  280.         R6, R7     : Floating;
  281.         W, X, Y, Z : Floating;
  282.         X1         : Floating;
  283.         A, B, C    : Floating;
  284.         Beta       : constant Floating := Floating (Ibeta);
  285.         Sqbeta     : constant Floating := Sqrt (Beta);
  286.         Albeta     : constant Floating := Log (Beta);
  287.         Ait        : constant Floating := Floating (It);
  288.         Xn         : constant Floating := Floating (N);
  289.     begin
  290.         New_Page;
  291. -----------------------------------------------------------
  292. --                RANDOM ARGUMENT TESTS
  293. -----------------------------------------------------------
  294.         A := One / Sqbeta;
  295.         B := One;
  296.         for J in 1..2 loop
  297.             C  := Log (B / A);
  298.             K1 := 0;
  299.             K3 := 0;
  300.             X1 := Zero;
  301.             R6 := Zero;
  302.             R7 := Zero;
  303.             for I in 1..N loop
  304.                 X := A * Exp (C * Ran);
  305.                 Y := X * X;
  306.                 Z := Sqrt (Y);
  307.                 W := (Z - X) / X;
  308.                 if W > Zero then
  309.                     K1 := K1 + 1;
  310.                 end if;
  311.                 if W < Zero then
  312.                     K3 := K3 + 1;
  313.                 end if;
  314.                 W := abs (W);
  315.                 if W > R6 then
  316.                     R6 := W;
  317.                     X1 := X;
  318.                 end if;
  319.                 R7 := R7 + (W * W);
  320.             end loop;
  321.             K2 := N - K1 - K3;
  322.             R7 := Sqrt (R7 / Xn);
  323.             New_Line (6);
  324.             Put (" TEST OF SQRT(X*X)-X");
  325.             New_Line (3);
  326.             Put (" ");
  327.             Put (N);
  328.             Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  329.             New_Line;
  330.             Put (A);
  331.             Put (",  ");
  332.             Put (B);
  333.             New_Line;
  334.             Put (" SQRT(X) WAS LARGER ");
  335.             Put (K1, 6);
  336.             Put_Line (" TIMES");
  337.             Put (" AGREED             ");
  338.             Put (K2, 6);
  339.             Put_Line (" TIMES");
  340.             Put (" WAS SMALLER        ");
  341.             Put (K3, 6);
  342.             Put_Line (" TIMES");
  343.             New_Line;
  344.             Put (" THERE ARE ");
  345.             Put (It, 4);
  346.             Put (" BASE ");
  347.             Put (Ibeta, 4);
  348.             Put (" SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER");
  349.             New_Line (3);
  350.             W := - 999.0E0;
  351.             if (R6 /= Zero) then
  352.                 W := Log (abs (R6)) / Albeta;
  353.             end if;
  354.             Put (" THE MAXIMUM RELATIVE ERROR OF ");
  355.             Put (R6, 5, 4, 2);
  356.             Put (" = ");
  357.             Put (Ibeta, 4);
  358.             Put (" **");
  359.             Put (W, 4, 2, 0);
  360.             New_Line;
  361.             Put ("    OCCURED FOR X = ");
  362.             Put (X1, 5, 6);
  363.             New_Line;
  364.             W := Max (Ait + W, Zero);
  365.             Put (" THE ESTIMATED LOSS OF BASE ");
  366.             Put (Ibeta, 4);
  367.             Put (" SIGNIFICANT DIGITS IS ");
  368.             Put (W, 4, 2, 0);
  369.             New_Line (2);
  370.             W := - 999.0E0;
  371.             if (R7 /= Zero) then
  372.                 W := Log (abs (R7)) / Albeta;
  373.             end if;
  374.             Put (" THE ROOT MEAN SQUARE RELATIVE ERROR WAS ");
  375.             Put (R7, 5, 4, 2);
  376.             Put (" = ");
  377.             Put (Ibeta, 4);
  378.             Put (" **");
  379.             Put (W, 4, 2, 0);
  380.             New_Line;
  381.             W := Max (Ait + W, Zero);
  382.             Put (" THE ESTIMATED LOSS OF BASE ");
  383.             Put (Ibeta, 4);
  384.             Put (" SIGNIFICANT DIGITS IS ");
  385.             Put (W, 4, 2, 0);
  386.             New_Line (2);
  387.             A := One;
  388.             B := Sqbeta;
  389.         end loop;
  390. ------------------------------------------------------------
  391. --                SPECIAL TESTS
  392. ------------------------------------------------------------
  393.         New_Line (6);
  394.         Put (" TEST OF SPECIAL ARGUMENTS");
  395.         New_Line (3);
  396.         X := Xmin;
  397.         Y := Sqrt (X);
  398.         Put (" SQRT(XMIN) =       SQRT(");
  399.         Put (Xmin);
  400.         Put (") =    ");
  401.         Put (Y);
  402.         New_Line (3);
  403.         X := One - Epsneg;
  404.         Y := Sqrt (X);
  405.         Put (" SQRT(1 - EPSNEG) = SQRT(1 - ");
  406.         Put (Epsneg);
  407.         Put (") = ");
  408.         Put (Y);
  409.         New_Line (3);
  410.         X := One;
  411.         Y := Sqrt (X);
  412.         Put (" SQRT(1.0) =        SQRT(");
  413.         Put (X);
  414.         Put (") =     ");
  415.         Put (Y);
  416.         New_Line (3);
  417.         X := One + Eps;
  418.         Y := Sqrt (X);
  419.         Put (" SQRT(1 + EPS) =    SQRT(1 + ");
  420.         Put (Eps);
  421.         Put (") = ");
  422.         Put (Y);
  423.         New_Line (3);
  424.         X := Xmax;
  425.         Y := Sqrt (X);
  426.         Put (" SQRT(XMAX) =       SQRT(");
  427.         Put (Xmax);
  428.         Put (") =    ");
  429.         Put (Y);
  430.         New_Line (3);
  431. ------------------------------------------------------------
  432. --                TESTS OF ERROR RETURNS
  433. ------------------------------------------------------------
  434.         New_Line (6);
  435.         Put (" TEST OF ERROR RETURNS");
  436.         New_Line (3);
  437.         X := Zero;
  438.         Put (" SQRT WILL BE CALLED WITH THE ARGUMENT ");
  439.         Put (X);
  440.         New_Line;
  441.         Put (" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  442.         New_Line (2);
  443.         Y := Sqrt (X);
  444.         Put (" SQRT RETURNED THE VALUE ");
  445.         Put (Y);
  446.         New_Line (4);
  447.         X := - One;
  448.         Put (" SQRT WILL BE CALLED WITH THE ARGUMENT ");
  449.         Put (X);
  450.         New_Line;
  451.         Put (" THIS SHOULD TRIGGER AN ERROR MESSAGE");
  452.         New_Line (2);
  453.         Y := Sqrt (X);
  454.         Put (" SQRT RETURNED THE VALUE ");
  455.         Put (Y);
  456.         New_Line (4);
  457.         Put (" THIS CONCLUDES THE TESTS");
  458.         New_Line;
  459.     end Test_Sqrt;
  460.  
  461. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  462. --TESTCBRT
  463. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  464.     separate (Test_Math_Functions)
  465.     procedure Test_Cbrt is
  466.         use Text_Io;
  467.         use Integer_Io, Floating_Io;
  468.         use Math_Functions;
  469.         N          : Integer := 2000;
  470.         K1, K2, K3 : Integer;
  471.         R6, R7     : Floating;
  472.         W, X, Y, Z : Floating;
  473.         X1         : Floating;
  474.         A, B, C    : Floating;
  475.         Beta       : constant Floating := Floating (Ibeta);
  476.         Cbbeta     : constant Floating := Cbrt (Beta);
  477.         Albeta     : constant Floating := Log (Beta);
  478.         Ait        : constant Floating := Floating (It);
  479.         Xn         : constant Floating := Floating (N);
  480.     begin
  481.         New_Page;
  482. -----------------------------------------------------------
  483. --                RANDOM ARGUMENT TESTS
  484. -----------------------------------------------------------
  485.         A := One / Cbbeta / Cbbeta;
  486.         for J in 1..3 loop
  487.             A  := A * Cbbeta;
  488.             B  := A * Cbbeta;
  489.             C  := Log (B / A);
  490.             K1 := 0;
  491.             K3 := 0;
  492.             X1 := Zero;
  493.             R6 := Zero;
  494.             R7 := Zero;
  495.             for I in 1..N loop
  496.                 X := A * Exp (C * Ran);
  497.                 Y := X * X * X;
  498.                 Z := Cbrt (Y);
  499.                 W := (Z - X) / X;
  500.                 if W > Zero then
  501.                     K1 := K1 + 1;
  502.                 end if;
  503.                 if W < Zero then
  504.                     K3 := K3 + 1;
  505.                 end if;
  506.                 W := abs (W);
  507.                 if W > R6 then
  508.                     R6 := W;
  509.                     X1 := X;
  510.                 end if;
  511.                 R7 := R7 + (W * W * W);
  512.             end loop;
  513.             K2 := N - K1 - K3;
  514.             R7 := Cbrt (R7 / Xn);
  515.             New_Line (6);
  516.             Put (" TEST OF CBRT(X*X*X)-X");
  517.             New_Line (3);
  518.             Put (" ");
  519.             Put (N);
  520.             Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  521.             New_Line;
  522.             Put (A);
  523.             Put (",  ");
  524.             Put (B);
  525.             New_Line;
  526.             Put (" CBRT(X) WAS LARGER ");
  527.             Put (K1, 6);
  528.             Put (" TIMES");
  529.             New_Line;
  530.             Put (" AGREED ");
  531.             Put (K2, 6);
  532.             Put (" TIMES");
  533.             New_Line;
  534.             Put (" WAS SMALLER ");
  535.             Put (K3, 6);
  536.             Put (" TIMES");
  537.             New_Line;
  538.             New_Line;
  539.             Put (" THERE ARE ");
  540.             Put (It, 4);
  541.             Put (" BASE ");
  542.             Put (Ibeta, 4);
  543.             Put (" SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER");
  544.             New_Line (3);
  545.             W := - 999.0E0;
  546.             if (R6 /= Zero) then
  547.                 W := Log (abs (R6)) / Albeta;
  548.             end if;
  549.             Put (" THE MAXIMUM RELATIVE ERROR OF ");
  550.             Put (R6, 5, 4, 2);
  551.             Put (" = ");
  552.             Put (Ibeta, 4);
  553.             Put (" **");
  554.             Put (W, 4, 2, 0);
  555.             New_Line;
  556.             Put ("    OCCURED FOR X = ");
  557.             Put (X1, 5, 6);
  558.             New_Line;
  559.             W := Max (Ait + W, Zero);
  560.             Put (" THE ESTIMATED LOSS OF BASE ");
  561.             Put (Ibeta, 4);
  562.             Put (" SIGNIFICANT DIGITS IS ");
  563.             Put (W, 4, 2, 0);
  564.             New_Line (2);
  565.             W := - 999.0E0;
  566.             if (R7 /= Zero) then
  567.                 W := Log (abs (R7)) / Albeta;
  568.             end if;
  569.             Put (" THE ROOT MEAN SQUARE RELATIVE ERROR WAS ");
  570.             Put (R7, 5, 4, 2);
  571.             Put (" = ");
  572.             Put (Ibeta, 4);
  573.             Put (" **");
  574.             Put (W, 4, 2, 0);
  575.             New_Line;
  576.             W := Max (Ait + W, Zero);
  577.             Put (" THE ESTIMATED LOSS OF BASE ");
  578.             Put (Ibeta, 4);
  579.             Put (" SIGNIFICANT DIGITS IS ");
  580.             Put (W, 4, 2, 0);
  581.             New_Line (2);
  582.         end loop;
  583. ------------------------------------------------------------
  584. --                SPECIAL TESTS
  585. ------------------------------------------------------------
  586.         New_Line (6);
  587.         Put (" TEST OF SPECIAL ARGUMENTS");
  588.         New_Line (3);
  589.         X := Xmin;
  590.         Y := Cbrt (X);
  591.         Put (" CBRT(XMIN) = CBRT(");
  592.         Put (Xmin);
  593.         Put (") = ");
  594.         Put (Y);
  595.         New_Line (3);
  596.         X := One - Epsneg;
  597.         Y := Cbrt (X);
  598.         Put (" CBRT(1 - EPSNEG) = CBRT(1 - ");
  599.         Put (Epsneg);
  600.         Put (") = ");
  601.         Put (Y);
  602.         New_Line (3);
  603.         X := One;
  604.         Y := Cbrt (X);
  605.         Put (" CBRT(1.0) = CBRT(");
  606.         Put (X);
  607.         Put (") = ");
  608.         Put (Y);
  609.         New_Line (3);
  610.         X := One + Eps;
  611.         Y := Cbrt (X);
  612.         Put (" CBRT(1 + EPS) = CBRT(1 + ");
  613.         Put (Eps);
  614.         Put (") = ");
  615.         Put (Y);
  616.         New_Line (3);
  617.         X := Xmax;
  618.         Y := Cbrt (X);
  619.         Put (" CBRT(XMAX) = CBRT(");
  620.         Put (Xmax);
  621.         Put (") = ");
  622.         Put (Y);
  623.         New_Line (3);
  624. ------------------------------------------------------------
  625. --                TESTS OF ERROR RETURNS
  626. ------------------------------------------------------------
  627.         New_Line (6);
  628.         Put (" TEST OF ERROR RETURNS");
  629.         New_Line (3);
  630.         X := Zero;
  631.         Put (" CBRT WILL BE CALLED WITH THE ARGUMENT ");
  632.         Put (X);
  633.         New_Line;
  634.         Put (" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  635.         New_Line (3);
  636.         Y := Cbrt (X);
  637.         Put (" CBRT RETURNED THE VALUE ");
  638.         Put (Y);
  639.         New_Line (4);
  640.         X := - One;
  641.         Put (" CBRT WILL BE CALLED WITH THE ARGUMENT ");
  642.         Put (X);
  643.         New_Line;
  644.         Put (" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  645.         New_Line (3);
  646.         Y := Cbrt (X);
  647.         Put (" CBRT RETURNED THE VALUE ");
  648.         Put (Y);
  649.         New_Line (4);
  650.         Put (" THIS CONCLUDES THE TESTS");
  651.         New_Line;
  652.     end Test_Cbrt;
  653.  
  654. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  655. --TESTLOG
  656. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  657.     separate (Test_Math_Functions)
  658.     procedure Test_Log is
  659.         use Text_Io;
  660.         use Integer_Io, Floating_Io;
  661.         use Math_Functions;
  662.         N : Integer := 2000;
  663.         K1, K2, K3         : Integer;
  664.         R6, R7             : Floating;
  665.         W, X, Xl, Y, Z, Zz : Floating;
  666.         X1 : Floating;
  667.         A, B, C, Del       : Floating;
  668.         Tenth              : constant Floating := 0.1;
  669.         Eight              : constant Floating := 8.0;
  670.         Beta               : constant Floating := Floating (Ibeta);
  671.         Albeta             : constant Floating := Log (Beta);
  672.         Ait                : constant Floating := Floating (It);
  673.         Xn : constant Floating := Floating (N);
  674.     begin
  675.         New_Page;
  676. -----------------------------------------------------------
  677. --                RANDOM ARGUMENT TESTS
  678. -----------------------------------------------------------
  679.         for J in 1..4 loop
  680.             case J is
  681.                 when 1 => 
  682.                     C := One;
  683.                     for I in 1..It / 3 loop
  684.                         C := C / Beta;
  685.                     end loop;
  686.                     A := One - C;
  687.                     B := One + C;
  688.                 when 2 => 
  689.                     A := Sqrt (Half);
  690.                     B := 15.0 / 16.0;
  691.                 when 3 => 
  692.                     A := Sqrt (Tenth);
  693.                     B := 0.9;
  694.                 when 4 => 
  695.                     A := 16.0;
  696.                     B := 240.0;
  697.             end case;
  698. --        C   := Log (B / A);
  699.             K1  := 0;
  700.             K3  := 0;
  701.             X1  := Zero;
  702.             R6  := Zero;
  703.             R7  := Zero;
  704.             Del := (B - A) / Xn;
  705.             Xl  := A;
  706.             for I in 1..N loop
  707.                 X := Del * Ran + Xl;
  708.                 case J is
  709.                     when 1 => 
  710.                         Y  := (X - Half) - Half;
  711.                         Zz := Log (X);
  712.                         Z  := One / 3.0;
  713.                         Z  := Y * (Z - Y / 4.0);
  714.                         Z  := (Z - Half) * Y * Y + Y;
  715.                     when 2 => 
  716.                         X  := (X + Eight) - Eight;
  717.                         Y  := X + X / 16.0;
  718.                         Z  := Log (X);
  719.                         Zz := Log (Y) - 7.77468_16434_84258_1E-5;
  720.                         Zz := Zz - 31.0 / 512.0;
  721.                     when 3 => 
  722.                         X  := (X + Eight) - Eight;
  723.                         Y  := X + X * Tenth;
  724.                         Z  := Log10 (X);
  725.                         Zz := Log10 (Y) - 3.77060_15822_50407_5E-4;
  726.                         Zz := Zz - 21.0 / 512.0;
  727.                     when 4 => 
  728.                         Z  := Log (X * X);
  729.                         Zz := Log (X);
  730.                         Zz := Zz + Zz;
  731.                 end case;
  732.                 W := One;
  733.                 if Z /= Zero then
  734.                     W := (Z - Zz) / Z;
  735.                 end if;
  736.                 Z := Sign (W, Z);
  737.                 if Z > Zero then
  738.                     K1 := K1 + 1;
  739.                 end if;
  740.                 if Z < Zero then
  741.                     K3 := K3 + 1;
  742.                 end if;
  743.                 W := abs (W);
  744.                 if W > R6 then
  745.                     R6 := W;
  746.                     X1 := X;
  747.                 end if;
  748.                 R7 := R7 + W * W;
  749.                 Xl := Xl + Del;
  750.             end loop;
  751.             K2 := N - K1 - K3;
  752.             R7 := Sqrt (R7 / Xn);
  753.             New_Line (6);
  754.             case J is
  755.                 when 1 => 
  756.                     Put (" TEST OF LOG(X) VS T.S. EXPANSION OF LOG(1+Y)  ");
  757.                     New_Line (3);
  758.                 when 2 => 
  759.                     Put (" TEST OF LOG(X) VS LOG(17X/16) - LOG(17/16)  ");
  760.                     New_Line (3);
  761.                 when 3 => 
  762.                     Put (" TEST OF LOG(X*X) VS 2 * LOG(X)  ");
  763.                     New_Line (3);
  764.                 when 4 => 
  765.                     Put (" TEST OF LOG10(X) VS LOG10(11X/10) - LOG10(11/10)  ");
  766.                     New_Line (3);
  767.             end case;
  768.             Put (N);
  769.             Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  770.             New_Line;
  771.             case J is
  772.                 when 1 => 
  773.                     Put ("      (1-EPS, 1+EPS), WHERE EPS = ");
  774.                     Put (C);
  775.                     New_Line (3);
  776.                 when 2 | 3 | 4 => 
  777.                     Put ("      (");
  778.                     Put (A);
  779.                     Put (",");
  780.                     Put (B);
  781.                     Put (")");
  782.                     New_Line;
  783.             end case;
  784.             case J is
  785.                 when 1 | 2 | 4 => 
  786.                     Put ("   LOG(X) WAS LARGER  ");
  787.                 when 3 => 
  788.                     Put (" LOG10(X) WAS LARGER  ");
  789.             end case;
  790.             Put (K1, 6);
  791.             Put (" TIMES");
  792.             New_Line;
  793.             Put ("              AGREED  ");
  794.             Put (K2, 6);
  795.             Put (" TIMES");
  796.             New_Line;
  797.             Put ("          WAS SMALLER ");
  798.             Put (K3, 6);
  799.             Put (" TIMES");
  800.             New_Line (3);
  801.             Put (" THERE ARE ");
  802.             Put (It, 4);
  803.             Put (" BASE ");
  804.             Put (Ibeta, 4);
  805.             Put (" SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER");
  806.             New_Line (3);
  807.             W := - 999.0E0;
  808.             if (R6 /= Zero) then
  809.                 W := Log (abs (R6)) / Albeta;
  810.             end if;
  811.             Put (" THE MAXIMUM RELATIVE ERROR OF ");
  812.             Put (R6, 5, 4, 2);
  813.             Put (" = ");
  814.             Put (Ibeta, 4);
  815.             Put (" **");
  816.             Put (W, 4, 2, 0);
  817.             New_Line;
  818.             Put ("    OCCURED FOR X = ");
  819.             Put (X1);
  820.             New_Line;
  821.             W := Max (Ait + W, Zero);
  822.             Put (" THE ESTIMATED LOSS OF BASE ");
  823.             Put (Ibeta, 4);
  824.             Put (" SIGNIFICANT DIGITS IS ");
  825.             Put (W, 4, 2, 0);
  826.             New_Line (2);
  827.             W := - 999.0E0;
  828.             if (R7 /= Zero) then
  829.                 W := Log (abs (R7)) / Albeta;
  830.             end if;
  831.             Put (" THE ROOT MEAN SQUARE RELATIVE ERROR WAS ");
  832.             Put (R7, 5, 4, 2);
  833.             Put (" = ");
  834.             Put (Ibeta, 4);
  835.             Put (" **");
  836.             Put (W, 4, 2, 0);
  837.             New_Line;
  838.             W := Max (Ait + W, Zero);
  839.             Put (" THE ESTIMATED LOSS OF BASE ");
  840.             Put (Ibeta, 4);
  841.             Put (" SIGNIFICANT DIGITS IS ");
  842.             Put (W, 4, 2, 0);
  843.             New_Line (2);
  844.         end loop;
  845. ------------------------------------------------------------
  846. --                SPECIAL TESTS
  847. ------------------------------------------------------------
  848.         New_Line (6);
  849.         Put (" SPECIAL TESTS");
  850.         New_Line (3);
  851.         Put (" THE IDENTITY LOG(X) = -LOG(1/X) WILL BE TESTED.");
  852.         New_Line;
  853.         for I in 1..5 loop
  854.             X := Ran;
  855.             X := X + X + 15.0;
  856.             Y := One / X;
  857.             Z := Log (X) + Log (Y);
  858.             Put (X);
  859.             Put ("    ");
  860.             Put (Z);
  861.             New_Line;
  862.         end loop;
  863.         New_Line (2);
  864.         Put (" TEST OF SPECIAL ARGUMENTS ");
  865.         New_Line (2);
  866.         X := One;
  867.         Y := Log (X);
  868.         Put (" LOG(1.0) = ");
  869.         Put (Y);
  870.         New_Line (3);
  871.         X := Xmin;
  872.         Y := Log (X);
  873.         Put (" LOG(XMIN) = LOG(");
  874.         Put (Xmin);
  875.         Put (") = ");
  876.         Put (Y);
  877.         New_Line (3);
  878.         X := Xmax;
  879.         Y := Log (X);
  880.         Put (" LOG(XMAX) = LOG(");
  881.         Put (Xmax);
  882.         Put (") = ");
  883.         Put (Y);
  884.         New_Line (3);
  885. ------------------------------------------------------------
  886. --                TESTS OF ERROR RETURNS
  887. ------------------------------------------------------------
  888.         New_Line (6);
  889.         Put_Line (" TEST OF ERROR RETURNS");
  890.         New_Line (2);
  891.         X := - 2.0;
  892.         Put (" LOG WILL BE CALLED WITH THE ARGUMENT ");
  893.         Put (X);
  894.         New_Line;
  895.         Put (" THIS SHOULD TRIGGER AN ERROR MESSAGE");
  896.         New_Line (3);
  897.         Y := Log (X);
  898.         Put (" LOG RETURNED THE VALUE ");
  899.         Put (Y);
  900.         New_Line (4);
  901.         X := Zero;
  902.         Put (" LOG WILL BE CALLED WITH THE ARGUMENT ");
  903.         Put (X);
  904.         New_Line;
  905.         Put (" THIS SHOULD TRIGGER AN ERROR MESSAGE");
  906.         New_Line (3);
  907.         Y := Log (X);
  908.         Put (" LOG RETURNED THE VALUE ");
  909.         Put (Y);
  910.         New_Line (4);
  911.         Put_Line (" THIS CONCLUDES THE TESTS");
  912.     end Test_Log;
  913.  
  914. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  915. --TESTEXP
  916. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  917.     separate (Test_Math_Functions)
  918.     procedure Test_Exp is
  919.         use Text_Io;
  920.         use Integer_Io, Floating_Io;
  921.         use Math_Functions;
  922.         N : Integer := 2000;
  923.         K1, K2, K3         : Integer;
  924.         R6, R7             : Floating;
  925.         W, X, Xl, Y, Z, Zz : Floating;
  926.         X1 : Floating;
  927.         A, B, C, D, Del    : Floating;
  928.         Tenth              : constant Floating := 0.1;
  929.         Ten                : constant Floating := 10.0;
  930.         V : Floating := 0.0625;
  931.         Beta               : Floating := Floating (Ibeta);
  932.         Albeta             : Floating := Log (Beta);
  933.         Ait                : Floating := Floating (It);
  934.         Xn : Floating := Floating (N);
  935.         Two                : constant Floating := One + One;
  936.         Half               : constant Floating := One / Two;
  937.     begin
  938.         New_Page;
  939. -----------------------------------------------------------
  940. --                RANDOM ARGUMENT TESTS
  941. -----------------------------------------------------------
  942.         for J in 1..3 loop
  943.             case J is
  944.                 when 1 => 
  945.                     A := Two;
  946.                     B := Log (A) * Half;
  947.                     A := - B + V;
  948.                 when 2 => 
  949.                     V := 45.0 / 16.0;
  950.                     A := - Ten * B;
  951.                     B := Ten * Xmin * Beta ** It;  --  Occasional underflow when 4.0
  952.                     B := Log (B);
  953.                 when 3 => 
  954.                     A := - Two * A;
  955.                     B := Ten * A;
  956.                     D := Log ((One - Tenth) * Xmax);
  957. --      if B < D  then       Cody-Waite seems to err here
  958.                     if B > D then
  959.                         B := D;
  960.                     end if;
  961.             end case;
  962.             K1  := 0;
  963.             K3  := 0;
  964.             X1  := Zero;
  965.             R6  := Zero;
  966.             R7  := Zero;
  967.             Del := (B - A) / Xn;
  968.             Xl  := A;
  969.             for I in 1..N loop
  970.                 X := Del * Ran + Xl;
  971. -----------------------------------------------------------
  972. --                       PURIFY ARGUMENTS
  973. -----------------------------------------------------------
  974.                 Y := X - V;
  975.                 if Y < Zero then
  976.                     X := Y + V;
  977.                 end if;
  978.                 Z  := Exp (X);
  979.                 Zz := Exp (Y);
  980.                 if J = 1 then
  981.                     Z := Z - Z * 6.05869_37186_52421_388E-2;
  982.                 else
  983.                     if Ibeta /= 10 then
  984.                         Z := Z * 0.0625 - Z * 2.44533_21046_92057_0389E-3;
  985.                     else
  986.                         Z := Z * 6.0E-2 + Z * 5.46678_95307_94296_106E-5;
  987.                     end if;
  988.                 end if;
  989.                 W := One;
  990.                 if Zz /= Zero then
  991.                     W := (Z - Zz) / Z;
  992.                 end if;
  993.                 if W > Zero then
  994.                     K1 := K1 + 1;
  995.                 end if;
  996.                 if W < Zero then
  997.                     K3 := K3 + 1;
  998.                 end if;
  999.                 W := abs (W);
  1000.                 if W > R6 then
  1001.                     R6 := W;
  1002.                     X1 := X;
  1003.                 end if;
  1004.                 R7 := R7 + W * W;
  1005.                 Xl := Xl + Del;
  1006.             end loop;
  1007.             K2 := N - K1 - K3;
  1008.             R7 := Sqrt (R7 / Xn);
  1009.             New_Line (6);
  1010.             Put (" TEST OF EXP(X - ");
  1011.             Put (V, 2, 4, 0);
  1012.             Put (") VS EXP(X)/EXP(");
  1013.             Put (V, 2, 4, 0);
  1014.             Put (") ");
  1015.             New_Line (3);
  1016.             Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  1017.             New_Line;
  1018.             Put ("      (");
  1019.             Put (A);
  1020.             Put (",");
  1021.             Put (B);
  1022.             Put (")");
  1023.             New_Line;
  1024.             Put (" EXP(X-V) WAS LARGER  ");
  1025.             Put (K1, 6);
  1026.             Put (" TIMES");
  1027.             New_Line;
  1028.             Put ("              AGREED  ");
  1029.             Put (K2, 6);
  1030.             Put (" TIMES");
  1031.             New_Line;
  1032.             Put ("          WAS SMALLER ");
  1033.             Put (K3, 6);
  1034.             Put (" TIMES");
  1035.             New_Line (3);
  1036.             Put (" THERE ARE ");
  1037.             Put (It, 4);
  1038.             Put (" BASE ");
  1039.             Put (Ibeta, 4);
  1040.             Put (" SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER");
  1041.             New_Line (3);
  1042.             W := - 999.0E0;
  1043.             if (R6 /= Zero) then
  1044.                 W := Log (abs (R6)) / Albeta;
  1045.             end if;
  1046.             Put (" THE MAXIMUM RELATIVE ERROR OF ");
  1047.             Put (R6, 5, 4, 2);
  1048.             Put (" = ");
  1049.             Put (Ibeta, 4);
  1050.             Put (" **");
  1051.             Put (W, 4, 2, 0);
  1052.             New_Line;
  1053.             Put ("    OCCURED FOR X = ");
  1054.             Put (X1, 5, 6);
  1055.             New_Line;
  1056.             W := Max (Ait + W, Zero);
  1057.             Put (" THE ESTIMATED LOSS OF BASE ");
  1058.             Put (Ibeta, 4);
  1059.             Put (" SIGNIFICANT DIGITS IS ");
  1060.             Put (W, 4, 2, 0);
  1061.             New_Line (2);
  1062.             W := - 999.0E0;
  1063.             if (R7 /= Zero) then
  1064.                 W := Log (abs (R7)) / Albeta;
  1065.             end if;
  1066.             Put (" THE ROOT MEAN SQUARE RELATIVE ERROR WAS ");
  1067.             Put (R7, 5, 4, 2);
  1068.             Put (" = ");
  1069.             Put (Ibeta, 4);
  1070.             Put (" **");
  1071.             Put (W, 4, 2, 0);
  1072.             New_Line;
  1073.             W := Max (Ait + W, Zero);
  1074.             Put (" THE ESTIMATED LOSS OF BASE ");
  1075.             Put (Ibeta, 4);
  1076.             Put (" SIGNIFICANT DIGITS IS ");
  1077.             Put (W, 4, 2, 0);
  1078.             New_Line (2);
  1079.         end loop;
  1080. ------------------------------------------------------------
  1081. --                SPECIAL TESTS
  1082. ------------------------------------------------------------
  1083.         New_Line (6);
  1084.         Put (" SPECIAL TESTS");
  1085.         New_Line (3);
  1086.         Put (" THE IDENTITY EXP(X)*EXP(-X) = 1.0) WILL BE TESTED.");
  1087.         New_Line;
  1088.         for I in 1..5 loop
  1089.             X := Ran * Beta;
  1090.             Y := - X;
  1091.             Z := Exp (X) * Exp (Y) - One;
  1092.             Put (X);
  1093.             Put ("    ");
  1094.             Put (Z);
  1095.             New_Line;
  1096.         end loop;
  1097.         New_Line (2);
  1098.         Put (" TEST OF SPECIAL ARGUMENTS ");
  1099.         New_Line (2);
  1100.         X := Zero;
  1101.         Y := Exp (X) - One;
  1102.         Put (" EXP(0.0) - 1.0             = ");
  1103.         Put (Y);
  1104.         New_Line (3);
  1105.         X := Truncate (Log (Xmin));
  1106.         Y := Exp (X);
  1107.         Put (" EXP(");
  1108.         Put (X);
  1109.         Put (") = ");
  1110.         Put (Y);
  1111.         New_Line (2);
  1112.         X := Truncate (Log (Xmax));
  1113.         Y := Exp (X);
  1114.         Put (" EXP(");
  1115.         Put (X);
  1116.         Put (") = ");
  1117.         Put (Y);
  1118.         New_Line (2);
  1119.         X := X / Two;
  1120.         C := X / Two;
  1121.         Y := Exp (X);
  1122.         Z := Exp (C);
  1123.         Z := Z * Z;
  1124.         New_Line;
  1125.         Put (" IF EXP(");
  1126.         Put (X);
  1127.         Put (") = ");
  1128.         Put (Y);
  1129.         Put (" IS NOT ABOUT ");
  1130.         New_Line;
  1131.         Put (" EXP(");
  1132.         Put (C);
  1133.         Put (")**2 = ");
  1134.         Put (Z);
  1135.         Put (" THERE IS AN ARG RED ERROR");
  1136.         New_Line (4);
  1137. ------------------------------------------------------------
  1138. --                TESTS OF ERROR RETURNS
  1139. ------------------------------------------------------------
  1140.         New_Line (6);
  1141.         Put (" TEST OF ERROR RETURNS");
  1142.         New_Line (3);
  1143.         X := - One / Sqrt (Xmin);
  1144.         Put (" EXP WILL BE CALLED WITH THE ARGUMENT ");
  1145.         Put (X);
  1146.         New_Line;
  1147.         Put (" THIS SHOULD TRIGGER AN ERROR MESSAGE");
  1148.         New_Line (2);
  1149.         Y := Exp (X);
  1150.         Put (" EXP RETURNED THE VALUE ");
  1151.         Put (Y);
  1152.         New_Line (4);
  1153.         X := - X;
  1154.         Put (" EXP WILL BE CALLED WITH THE ARGUMENT ");
  1155.         Put (X);
  1156.         New_Line;
  1157.         Put (" THIS SHOULD TRIGGER AN ERROR MESSAGE");
  1158.         New_Line (2);
  1159.         Y := Exp (X);
  1160.         Put (" EXP RETURNED THE VALUE ");
  1161.         Put (Y);
  1162.         New_Line (4);
  1163.         Put (" THIS CONCLUDES THE TESTS");
  1164.         New_Line;
  1165.     end Test_Exp;
  1166.  
  1167. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1168. --TESTPOWER
  1169. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1170.     separate (Test_Math_Functions)
  1171.     procedure Test_Power is
  1172.         use Text_Io;
  1173.         use Integer_Io, Floating_Io;
  1174.         use Math_Functions;
  1175.         N : Integer := 2000;
  1176.         J, K1, K2, K3 : Integer;
  1177.         R6, R7 : Floating;
  1178.         W, X, X1, Xl, Xsq, Y, Y2, Z, Zz : Floating;
  1179.         A, B, C, D, Del, Dely, Scale    : Floating;
  1180.         Y1 : Floating := One;
  1181.         Beta : constant Floating := Floating (Ibeta);
  1182.         Albeta : constant Floating := Log (Beta);
  1183.         Ait : Floating := Floating (It);
  1184.         Xn : Floating := Floating (N);
  1185.         Alxmax : constant Floating := Log (Xmax);
  1186.         Two : constant Floating := One + One;
  1187.         Onep5 : constant Floating := (Two + One) / Two;
  1188.     begin
  1189.         New_Page;
  1190.         Scale := One;
  1191.         J     := (It + 1) / 2;
  1192.         for I in 1..J loop
  1193.             Scale := Scale * Beta;
  1194.         end loop;
  1195.         A    := One / Beta;
  1196.         B    := One;
  1197.         C    := Max (Alxmax, Log (Xmin)) / Log (100.0);
  1198.         Dely := - C - C;
  1199. -----------------------------------------------------------------------
  1200. --  RANDOM   ARGUMENT   ACCURACY   TESTS
  1201. -----------------------------------------------------------------------
  1202.         for J in 1..4 loop
  1203.             K1  := 0;
  1204.             K3  := 0;
  1205.             X1  := Zero;
  1206.             R6  := Zero;
  1207.             R7  := Zero;
  1208.             Del := (B - A) / Xn;
  1209.             Xl  := A;
  1210.             for I in 1..N loop
  1211.                 X := Del * Ran + Xl;
  1212.                 case J is
  1213.                     when 1 => 
  1214.                         Zz := X ** One;
  1215.                         Z  := X;
  1216.                     when 2 | 3 => 
  1217.                         W   := Scale * X;
  1218.                         X   := (X + W) - W;
  1219.                         Xsq := X * X;
  1220.                         Zz  := Xsq ** Onep5;
  1221.                         Z   := X * Xsq;
  1222.                     when 4 => 
  1223.                         W   := Scale * X;
  1224.                         X   := (X + W) - W;
  1225.                         Xsq := X * X;
  1226.                         Y   := Dely * Ran + C;
  1227.                         Y2  := (Y / Two + Y) - Y;
  1228.                         Y   := Y2 + Y2;
  1229.                         Z   := X ** Y;
  1230.                         Zz  := Xsq ** Y2;
  1231.                 end case;
  1232.                 W := One;
  1233.                 if Z /= Zero then
  1234.                     W := (Z - Zz) / Z;
  1235.                 end if;
  1236.                 if W > Zero then
  1237.                     K1 := K1 + 1;
  1238.                 end if;
  1239.                 if W < Zero then
  1240.                     K3 := K3 + 1;
  1241.                 end if;
  1242.                 W := abs (W);
  1243.                 if W > R6 then
  1244.                     R6 := W;
  1245.                     X1 := X;
  1246.                     if J = 4 then
  1247.                         Y1 := Y;
  1248.                     end if;
  1249.                 else
  1250.                     R7 := R7 + W * W;
  1251.                     Xl := Xl + Del;
  1252.                 end if;
  1253.             end loop;
  1254.             K2 := N - K3 - K1;
  1255.             R7 := Sqrt (R7 / Xn);
  1256.             New_Line (6);
  1257.             case J is
  1258.                 when 1 => 
  1259.                     Put ("TEST OF X ** 1.0 VS X");
  1260.                     New_Line (2);
  1261.                     Put (N);
  1262.                     Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL");
  1263.                     New_Line;
  1264.                     Put ("       (");
  1265.                     Put (A);
  1266.                     Put (", ");
  1267.                     Put (B);
  1268.                     Put (")");
  1269.                     New_Line;
  1270.                     Put ("X ** 1.0 WAS LARGER ");
  1271.                 when 2 | 3 => 
  1272.                     Put ("TEST OF XSQ ** 1.5 VS XSQ * X");
  1273.                     New_Line (2);
  1274.                     Put (N);
  1275.                     Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL");
  1276.                     New_Line;
  1277.                     Put ("      (");
  1278.                     Put (A);
  1279.                     Put (", ");
  1280.                     Put (B);
  1281.                     Put (")");
  1282.                     New_Line;
  1283.                     Put ("X ** 1.5 WAS LARGER ");
  1284.                 when 4 => 
  1285.                     Put ("TEST OF XSQ ** 1.5 VS XSQ ** Y/2");
  1286.                     New_Line (2);
  1287.                     D := C + Dely;
  1288.                     Put (N);
  1289.                     Put (" RANDOM ARGUMENTS WERE TESTED FROM THE REGION");
  1290.                     New_Line;
  1291.                     Put ("X IN ");
  1292.                     Put (A);
  1293.                     Put (", ");
  1294.                     Put (B);
  1295.                     New_Line;
  1296.                     Put ("Y IN ");
  1297.                     Put (C);
  1298.                     Put (", ");
  1299.                     Put (D);
  1300.                     New_Line;
  1301.                     Put ("X ** Y   WAS LARGER ");
  1302.             end case;
  1303.             Put (K1, 6);
  1304.             Put (" TIMES");
  1305.             New_Line;
  1306.             Put ("             AGREED ");
  1307.             Put (K2, 6);
  1308.             Put (" TIMES");
  1309.             New_Line;
  1310.             Put ("        WAS SMALLER ");
  1311.             Put (K3, 6);
  1312.             Put (" TIMES");
  1313.             New_Line (3);
  1314.             Put ("THERE ARE ");
  1315.             Put (It, 4);
  1316.             Put (" BASE ");
  1317.             Put (Ibeta, 4);
  1318.             Put (" SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER");
  1319.             New_Line;
  1320.             W := - 999.0;
  1321.             if R6 /= Zero then
  1322.                 W := Log (abs (R6)) / Albeta;
  1323.             end if;
  1324.             Put ("THE MAXIMUM RELATIVE ERROR OF ");
  1325.             Put (R6, 5, 4, 2);
  1326.             Put (" = ");
  1327.             Put (Ibeta, 4);
  1328.             Put (" ** ");
  1329.             Put (W, 4, 2, 0);
  1330.             New_Line;
  1331.             Put (" OCCURED FOR X = ");
  1332.             Put (X1);
  1333.             case J is
  1334.                 when 1 | 2 | 3 => 
  1335.                     New_Line;
  1336.                 when 4 => 
  1337.                     Put (", Y = ");
  1338.                     Put (Y1);
  1339.                     New_Line;
  1340.             end case;
  1341.             W := Max (Ait + W, Zero);
  1342.             Put ("THE ESTIMATED LOSS OF BASE ");
  1343.             Put (Ibeta, 4);
  1344.             Put (" SIGNIFICANT DIGITS IS");
  1345.             Put (W, 4, 2, 0);
  1346.             New_Line (2);
  1347.             W := - 999.0;
  1348.             if R7 /= Zero then
  1349.                 W := Log (abs (R7)) / Albeta;
  1350.             end if;
  1351.             Put ("THE ROOT MEAN SQUARE RELATIVE ERROR WAS ");
  1352.             Put (R7, 5, 4, 2);
  1353.             Put (" = ");
  1354.             Put (Ibeta, 4);
  1355.             Put (" ** ");
  1356.             Put (W, 4, 2, 0);
  1357.             New_Line;
  1358.             W := Max (Ait + W, Zero);
  1359.             Put ("THE ESTIMATED LOSS OF BASE ");
  1360.             Put (Ibeta, 4);
  1361.             Put (" SIGNIFICANT DIGITS IS");
  1362.             Put (W, 4, 2, 0);
  1363.             New_Line (2);
  1364.             case J is
  1365.                 when 1 => 
  1366.                     null;
  1367.                 when 2 | 4 => 
  1368.                     A := One;
  1369.                     B := Exp (Alxmax / 3.0);
  1370.                 when 3 => 
  1371.                     B := 10.0;
  1372.                     A := 0.01;
  1373.             end case;
  1374.         end loop;
  1375. ------------------------------------------------------------------------
  1376. --     SPECIAL   TESTS
  1377. ------------------------------------------------------------------------
  1378.         New_Line (6);
  1379.         Put ("SPECIAL TESTS ");
  1380.         New_Line (3);
  1381.         Put ("THE IDENTITY X ** Y = (1/X) ** (-Y) WILL BE TESTED");
  1382.         New_Line;
  1383.         B := 10.0;
  1384.         for I in 1..5 loop
  1385.             X  := Ran * B + One;
  1386.             Y  := Ran * B + One;
  1387.             Z  := X ** Y;
  1388.             Zz := (One / X) ** (- Y);
  1389.             W  := (Z - Zz) / Z;
  1390.             Put (X);
  1391.             Put ("  ");
  1392.             Put (Y);
  1393.             Put ("  ");
  1394.             Put (W);
  1395.             New_Line;
  1396.         end loop;
  1397. --------------------------------------------------------------------------
  1398. --   TEST   OF   ERROR   RETURNS
  1399. --------------------------------------------------------------------------
  1400.         New_Line (6);
  1401.         Put ("TEST OF ERROR RETURNS ");
  1402.         New_Line (2);
  1403.         X := Beta;
  1404.         Y := Floating (Minexp);
  1405.         Put (X);
  1406.         Put (" ** ");
  1407.         Put (Y);
  1408.         Put (" WILL BE COMPUTED");
  1409.         New_Line;
  1410.         Put ("THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  1411.         New_Line (2);
  1412.         Z := X ** Y;
  1413.         Put ("THE VALUE RETURNED IS ");
  1414.         Put (Z);
  1415.         New_Line (4);
  1416.         Y := Floating (Maxexp - 1);
  1417.         Put (X);
  1418.         Put (" ** ");
  1419.         Put (Y);
  1420.         Put (" WILL BE COMPUTED");
  1421.         New_Line;
  1422.         Put ("THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  1423.         New_Line (2);
  1424.         Z := X ** Y;
  1425.         Put ("THE VALUE RETURNED IS ");
  1426.         Put (Z);
  1427.         New_Line (4);
  1428.         X := Zero;
  1429.         Y := Two;
  1430.         Put (X);
  1431.         Put (" ** ");
  1432.         Put (Y);
  1433.         Put (" WILL BE COMPUTED");
  1434.         New_Line;
  1435.         Put ("THIS SHOULD NOT TRIGGER AN ERROR MESSAGE ");
  1436.         New_Line (2);
  1437.         Z := X ** Y;
  1438.         Put ("THE VALUE RETURNED IS ");
  1439.         Put (Z);
  1440.         New_Line (4);
  1441.         X := - Two;
  1442.         Y := Zero;
  1443.         Put (X);
  1444.         Put (" ** ");
  1445.         Put (Y);
  1446.         Put (" WILL BE COMPUTED");
  1447.         New_Line;
  1448.         Put ("THIS SHOULD TRIGGER AN ERROR MESSAGE");
  1449.         New_Line (2);
  1450.         Z := X ** Y;
  1451.         Put ("THE VALUE RETURNED IS ");
  1452.         Put (Z);
  1453.         New_Line (4);
  1454.         X := - Two;
  1455.         Y := Two;
  1456.         Put (X);
  1457.         Put (" ** ");
  1458.         Put (Y);
  1459.         Put (" WILL BE COMPUTED");
  1460.         New_Line;
  1461.         Put ("THIS SHOULD TRIGGER AN ERROR MESSAGE");
  1462.         New_Line (2);
  1463.         Z := X ** Y;
  1464.         Put ("THE VALUE RETURNED IS ");
  1465.         Put (Z);
  1466.         New_Line (4);
  1467.         X := Zero;
  1468.         Y := Zero;
  1469.         Put (X);
  1470.         Put (" ** ");
  1471.         Put (Y);
  1472.         Put (" WILL BE COMPUTED");
  1473.         New_Line;
  1474.         Put ("THIS SHOULD TRIGGER AN ERROR MESSAGE");
  1475.         New_Line (2);
  1476.         Z := X ** Y;
  1477.         Put ("THE VALUE RETURNED IS ");
  1478.         Put (Z);
  1479.         New_Line (4);
  1480.         Put_Line ("THIS CONCLUDES THE TESTS");
  1481.     end Test_Power;
  1482.  
  1483. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1484. --TESTSIN
  1485. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1486.     separate (Test_Math_Functions)
  1487.     procedure Test_Sin_Cos is
  1488.         use Text_Io;
  1489.         use Integer_Io, Floating_Io;
  1490.         use Math_Functions;
  1491.         N : Integer := 2000;
  1492.         K1, K2, K3         : Integer;
  1493.         R6, R7             : Floating;
  1494.         W, X, Xl, Y, Z, Zz : Floating;
  1495.         X1 : Floating;
  1496.         A, B, C, D, Del    : Floating;
  1497.         Beta               : constant Floating := Floating (Ibeta);
  1498.         Albeta             : constant Floating := Log (Beta);
  1499.         Betap              : Floating := Beta ** It;
  1500.         Ait                : Floating := Floating (It);
  1501.         Xn : Floating := Floating (N);
  1502.         Three              : constant Floating := One + One + One;
  1503.     begin
  1504.         New_Page;
  1505.         A := Zero;
  1506.         B := 1.57079_63267_94896_61923;
  1507.         C := B;
  1508. -----------------------------------------------------------
  1509. --                RANDOM ARGUMENT TESTS
  1510. -----------------------------------------------------------
  1511.         for J in 1..3 loop
  1512.             K1  := 0;
  1513.             K3  := 0;
  1514.             X1  := Zero;
  1515.             R6  := Zero;
  1516.             R7  := Zero;
  1517.             Del := (B - A) / Xn;
  1518.             Xl  := A;
  1519.             for I in 1..N loop
  1520.                 X := Del * Ran + Xl;
  1521. -----------------------------------------------------------
  1522. --                       PURIFY ARGUMENTS
  1523. -----------------------------------------------------------
  1524.                 Y := X / Three;
  1525.                 Y := (X + Y) - X;
  1526.                 X := Three * Y;
  1527.                 case J is
  1528.                     when 1 | 2 => 
  1529.                         Z  := Sin (X);
  1530.                         Zz := Sin (Y);
  1531.                         if Z = 0.0 then
  1532.                             W := One;
  1533.                         else
  1534.                             W := (Z - Zz * (Three - 4.0 * Zz * Zz)) / Z;
  1535.                         end if;
  1536.                     when 3 => 
  1537.                         Z  := Cos (X);
  1538.                         Zz := Cos (Y);
  1539.                         if Z = 0.0 then
  1540.                             W := One;
  1541.                         else
  1542.                             W := (Z + Zz * (Three - 4.0 * Zz * Zz)) / Z;
  1543.                         end if;
  1544.                 end case;
  1545.                 if W > Zero then
  1546.                     K1 := K1 + 1;
  1547.                 end if;
  1548.                 if W < Zero then
  1549.                     K3 := K3 + 1;
  1550.                 end if;
  1551.                 W := abs (W);
  1552.                 if W > R6 then
  1553.                     R6 := W;
  1554.                     X1 := X;
  1555.                 end if;
  1556.                 R7 := R7 + W * W;
  1557.                 Xl := Xl + Del;
  1558.             end loop;
  1559.             K2 := N - K1 - K3;
  1560.             R7 := Sqrt (R7 / Xn);
  1561.             New_Line (6);
  1562.             case J is
  1563.                 when 1 | 2 => 
  1564.                     Put (" TEST OF SIN(X) VS 3*SIN(X/3) - 4*SIN(X/3)**3 ");
  1565.                     New_Line (3);
  1566.                     Put (N);
  1567.                     Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  1568.                     New_Line;
  1569.                     Put ("      (");
  1570.                     Put (A);
  1571.                     Put (",");
  1572.                     Put (B);
  1573.                     Put (")");
  1574.                     New_Line;
  1575.                     Put ("   SIN(X) WAS LARGER  ");
  1576.                     Put (K1);
  1577.                     Put (" TIMES");
  1578.                     New_Line;
  1579.                     Put ("              AGREED  ");
  1580.                     Put (K2);
  1581.                     Put (" TIMES");
  1582.                     New_Line;
  1583.                     Put ("         WAS SMALLER  ");
  1584.                     Put (K3);
  1585.                     Put (" TIMES");
  1586.                     New_Line;
  1587.                     New_Line;
  1588.                     New_Line;
  1589.                 when 3 => 
  1590.                     Put (" TEST OF COS(X) VS 4*COS(X/3)**3 - 3*COS(X/3) ");
  1591.                     New_Line (3);
  1592.                     Put (N);
  1593.                     Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  1594.                     New_Line;
  1595.                     Put ("      (");
  1596.                     Put (A);
  1597.                     Put (",");
  1598.                     Put (B);
  1599.                     Put (")");
  1600.                     New_Line;
  1601.                     Put ("   COS(X) WAS LARGER  ");
  1602.                     Put (K1, 6);
  1603.                     Put (" TIMES");
  1604.                     New_Line;
  1605.                     Put ("              AGREED  ");
  1606.                     Put (K2, 6);
  1607.                     Put (" TIMES");
  1608.                     New_Line;
  1609.                     Put ("          WAS SMALLER ");
  1610.                     Put (K3, 6);
  1611.                     Put (" TIMES");
  1612.                     New_Line (3);
  1613.             end case;
  1614.             Put (" THERE ARE ");
  1615.             Put (It, 4);
  1616.             Put (" BASE ");
  1617.             Put (Ibeta, 4);
  1618.             Put (" SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER");
  1619.             New_Line (3);
  1620.             W := - 999.0E0;
  1621.             if (R6 /= Zero) then
  1622.                 W := Log (abs (R6)) / Albeta;
  1623.             end if;
  1624.             Put (" THE MAXIMUM RELATIVE ERROR OF ");
  1625.             Put (R6, 5, 4, 2);
  1626.             Put (" = ");
  1627.             Put (Ibeta, 4);
  1628.             Put (" **");
  1629.             Put (W, 4, 2, 0);
  1630.             New_Line;
  1631.             Put ("    OCCURED FOR X = ");
  1632.             Put (X1, 5, 9);
  1633.             New_Line;
  1634.             W := Max (Ait + W, Zero);
  1635.             Put (" THE ESTIMATED LOSS OF BASE ");
  1636.             Put (Ibeta, 4);
  1637.             Put (" SIGNIFICANT DIGITS IS ");
  1638.             Put (W, 4, 2, 0);
  1639.             New_Line (2);
  1640.             W := - 999.0E0;
  1641.             if (R7 /= Zero) then
  1642.                 W := Log (abs (R7)) / Albeta;
  1643.             end if;
  1644.             Put (" THE ROOT MEAN SQUARE RELATIVE ERROR WAS ");
  1645.             Put (R7, 5, 4, 2);
  1646.             Put (" = ");
  1647.             Put (Ibeta, 4);
  1648.             Put (" **");
  1649.             Put (W, 4, 2, 0);
  1650.             New_Line;
  1651.             W := Max (Ait + W, Zero);
  1652.             Put (" THE ESTIMATED LOSS OF BASE ");
  1653.             Put (Ibeta, 4);
  1654.             Put (" SIGNIFICANT DIGITS IS ");
  1655.             Put (W, 4, 2, 0);
  1656.             New_Line (2);
  1657.             A := 18.84955592;
  1658.             if J = 2 then
  1659.                 A := B + C;
  1660.             end if;
  1661.             B := A + C;
  1662.         end loop;
  1663. ------------------------------------------------------------
  1664. --                SPECIAL TESTS
  1665. ------------------------------------------------------------
  1666.         New_Line (6);
  1667.         Put (" SPECIAL TESTS");
  1668.         New_Line (3);
  1669.         C := One / Beta ** (It / 2);
  1670.         Z := (Sin (A + C) - Sin (A - C)) / (C + C);
  1671.         Put (" IF ");
  1672.         Put (Z);
  1673.         Put (" IS NOT ALMOST 1.0,    SIN HAS THE WRONG PERIOD. ");
  1674.         New_Line (3);
  1675.         Put (" THE IDENTITY    SIN(-X) = -SIN(X)    WILL BE TESTED.");
  1676.         New_Line (3);
  1677.         Put ("        X         F(X) + F(-X)");
  1678.         New_Line (2);
  1679.         for I in 1..5 loop
  1680.             X := Ran * A;
  1681.             Z := Sin (X) + Sin (- X);
  1682.             Put (X);
  1683.             Put ("    ");
  1684.             Put (Z);
  1685.             New_Line;
  1686.         end loop;
  1687.         New_Line (2);
  1688.         Put (" THE IDENTITY   SIN(X) = X   X SMALL, WILL BE TESTED");
  1689.         New_Line (2);
  1690.         Put ("         X         X - F(X)");
  1691.         New_Line;
  1692.         X := Ran / Betap;
  1693.         for I in 1..5 loop
  1694.             Z := X - Sin (X);
  1695.             Put (X);
  1696.             Put ("    ");
  1697.             Put (Z);
  1698.             New_Line;
  1699.             X := X / Beta;
  1700.         end loop;
  1701.         New_Line (3);
  1702.         Put (" THE IDENTITY   COS(-X) = COS(X)   WILL BE TESTED");
  1703.         New_Line (2);
  1704.         Put ("        X         F(X) - F(-X)");
  1705.         New_Line (2);
  1706.         for I in 1..5 loop
  1707.             X := Ran * A;
  1708.             Z := Cos (X) - Cos (- X);
  1709.             Put (X);
  1710.             Put ("    ");
  1711.             Put (Z);
  1712.             New_Line;
  1713.         end loop;
  1714.         New_Line (3);
  1715.         Put (" TEST OF UNDERFLOW FOR VERY SMALL ARGUMENT. ");
  1716.         New_Line;
  1717.         X := Beta ** (- It);
  1718.         Y := Sin (X);
  1719.         New_Line;
  1720.         Put ("       SIN(");
  1721.         Put (X);
  1722.         Put (") = ");
  1723.         Put (Y);
  1724.         New_Line (4);
  1725.         Put (" THE FOLLOWING 3 LINES ILLUSTRATE THE LOSS IN SIGNIFICANCE");
  1726.         New_Line;
  1727.         Put (" FOR LARGE ARGUMENTS. ");
  1728.         Put (" THE ARGUMENTS ARE CONSECUTIVE.");
  1729.         New_Line;
  1730.         Z := Sqrt (Betap);
  1731.         X := Z * (One - Epsneg);
  1732.         Y := Sin (X);
  1733.         Put ("       SIN(");
  1734.         Put (X);
  1735.         Put (") = ");
  1736.         Put (Y);
  1737.         New_Line;
  1738.         Y := Sin (Z);
  1739.         Put ("       SIN(");
  1740.         Put (X);
  1741.         Put (") = ");
  1742.         Put (Y);
  1743.         New_Line;
  1744.         X := Z * (One + Eps);
  1745.         Y := Sin (X);
  1746.         Put ("       SIN(");
  1747.         Put (X);
  1748.         Put (") = ");
  1749.         Put (Y);
  1750.         New_Line;
  1751. ------------------------------------------------------------
  1752. --                TESTS OF ERROR RETURNS
  1753. ------------------------------------------------------------
  1754.         New_Line (6);
  1755.         Put (" TEST OF ERROR RETURNS");
  1756.         New_Line (3);
  1757.         X := Betap;
  1758.         Put (" SIN WILL BE CALLED WITH THE ARGUMENT ");
  1759.         Put (X);
  1760.         New_Line;
  1761.         Put (" THIS SHOULD TRIGGER AN ERROR MESSAGE");
  1762.         New_Line;
  1763.         Y := Sin (X);
  1764.         Put (" SIN RETURNED THE VALUE ");
  1765.         Put (Y);
  1766.         New_Line (4);
  1767.         Put (" THIS CONCLUDES THE TESTS");
  1768.         New_Line;
  1769.     end Test_Sin_Cos;
  1770.  
  1771. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1772. --TESTTAN
  1773. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1774.     separate (Test_Math_Functions)
  1775.     procedure Test_Tan_Cot is
  1776.         use Text_Io;
  1777.         use Integer_Io, Floating_Io;
  1778.         use Math_Functions;
  1779.         N : Integer := 2000;
  1780.         K1, K2, K3         : Integer;
  1781.         R6, R7             : Floating;
  1782.         W, X, Xl, Y, Z, Zz : Floating;
  1783.         X1 : Floating;
  1784.         A, B, C, D, Del    : Floating;
  1785.         Beta               : Floating := Floating (Ibeta);
  1786.         Albeta             : Floating := Log (Beta);
  1787.         Betap              : Floating := Beta ** It;
  1788.         Ait                : Floating := Floating (It);
  1789.         Xn : Floating := Floating (N);
  1790.         Half               : constant Floating := One / (One + One);
  1791.     begin
  1792.         New_Page;
  1793.         A := Zero;
  1794.         B := Pi * 0.25;
  1795. -----------------------------------------------------------
  1796. --                RANDOM ARGUMENT TESTS
  1797. -----------------------------------------------------------
  1798.         for J in 1..4 loop
  1799.             K1  := 0;
  1800.             K3  := 0;
  1801.             X1  := Zero;
  1802.             R6  := Zero;
  1803.             R7  := Zero;
  1804.             Del := (B - A) / Xn;
  1805.             Xl  := A;
  1806.             for I in 1..N loop
  1807.                 X := Del * Ran + Xl;
  1808. -----------------------------------------------------------
  1809. --                       PURIFY ARGUMENTS
  1810. -----------------------------------------------------------
  1811.                 Y := X * Half;
  1812.                 X := Y + Y;
  1813.                 case J is
  1814.                     when 1..3 => 
  1815.                         Z  := Tan (X);
  1816.                         Zz := Tan (Y);
  1817.                         if Z = 0.0 then
  1818.                             W := One;
  1819.                         else
  1820.                             W := ((Half - Zz) + Half) * ((Half + Zz) + Half);
  1821.                             W := (Z - (Zz + Zz) / W) / Z;
  1822.                         end if;
  1823.                     when 4 => 
  1824.                         Z  := Cot (X);
  1825.                         Zz := Cot (Y);
  1826.                         if Z = 0.0 then
  1827.                             W := One;
  1828.                         else
  1829.                             W := ((Half - Zz) + Half) * ((Half + Zz) + Half);
  1830.                             W := (Z + W / (Zz + Zz)) / Z;
  1831.                         end if;
  1832.                 end case;
  1833.                 if W > Zero then
  1834.                     K1 := K1 + 1;
  1835.                 end if;
  1836.                 if W < Zero then
  1837.                     K3 := K3 + 1;
  1838.                 end if;
  1839.                 W := abs (W);
  1840.                 if W > R6 then
  1841.                     R6 := W;
  1842.                     X1 := X;
  1843.                 end if;
  1844.                 R7 := R7 + W * W;
  1845.                 Xl := Xl + Del;
  1846.             end loop;
  1847.             K2 := N - K1 - K3;
  1848.             R7 := Sqrt (R7 / Xn);
  1849.             New_Line (6);
  1850.             case J is
  1851.                 when 1..3 => 
  1852.                     Put (" TEST OF TAN(X) VS 2*TAN(X/2) / (1-TAN(X/2)**2) ");
  1853.                     New_Line (3);
  1854.                     Put (N);
  1855.                     Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  1856.                     New_Line;
  1857.                     Put ("      (");
  1858.                     Put (A);
  1859.                     Put (",");
  1860.                     Put (B);
  1861.                     Put (")");
  1862.                     New_Line;
  1863.                     Put ("   TAN(X) WAS LARGER  ");
  1864.                     Put (K1);
  1865.                     Put (" TIMES");
  1866.                     New_Line;
  1867.                     Put ("              AGREED  ");
  1868.                     Put (K2);
  1869.                     Put (" TIMES");
  1870.                     New_Line;
  1871.                     Put ("          WAS SMALLER ");
  1872.                     Put (K3);
  1873.                     Put (" TIMES");
  1874.                     New_Line (3);
  1875.                 when 4 => 
  1876.                     Put (" TEST OF COT(X) VS (COT(X/2)**2-1) / (2*COT(X/2)) ");
  1877.                     New_Line (3);
  1878.                     Put (N);
  1879.                     Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  1880.                     New_Line;
  1881.                     Put ("      (");
  1882.                     Put (A);
  1883.                     Put (",");
  1884.                     Put (B);
  1885.                     Put (")");
  1886.                     New_Line;
  1887.                     Put ("   COT(X) WAS LARGER  ");
  1888.                     Put (K1);
  1889.                     Put (" TIMES");
  1890.                     New_Line;
  1891.                     Put ("              AGREED  ");
  1892.                     Put (K2);
  1893.                     Put (" TIMES");
  1894.                     New_Line;
  1895.                     Put ("          WAS SMALLER ");
  1896.                     Put (K3);
  1897.                     Put (" TIMES");
  1898.                     New_Line;
  1899.                     New_Line;
  1900.                     New_Line;
  1901.             end case;
  1902.             Put (" THERE ARE ");
  1903.             Put (It, 4);
  1904.             Put (" BASE ");
  1905.             Put (Ibeta, 4);
  1906.             Put (" SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER");
  1907.             New_Line (3);
  1908.             W := - 999.0E0;
  1909.             if (R6 /= Zero) then
  1910.                 W := Log (abs (R6)) / Albeta;
  1911.             end if;
  1912.             Put (" THE MAXIMUM RELATIVE ERROR OF ");
  1913.             Put (R6, 5, 4, 2);
  1914.             Put (" = ");
  1915.             Put (Ibeta, 4);
  1916.             Put (" **");
  1917.             Put (W, 4, 2, 0);
  1918.             New_Line;
  1919.             Put ("    OCCURED FOR X = ");
  1920.             Put (X1);
  1921.             New_Line;
  1922.             W := Max (Ait + W, Zero);
  1923.             Put (" THE ESTIMATED LOSS OF BASE ");
  1924.             Put (Ibeta, 4);
  1925.             Put (" SIGNIFICANT DIGITS IS ");
  1926.             Put (W, 4, 2, 0);
  1927.             New_Line (2);
  1928.             W := - 999.0E0;
  1929.             if (R7 /= Zero) then
  1930.                 W := Log (abs (R7)) / Albeta;
  1931.             end if;
  1932.             Put (" THE ROOT MEAN SQUARE RELATIVE ERROR WAS ");
  1933.             Put (R7, 5, 4, 2);
  1934.             Put (" = ");
  1935.             Put (Ibeta, 4);
  1936.             Put (" **");
  1937.             Put (W, 4, 2, 0);
  1938.             New_Line;
  1939.             W := Max (Ait + W, Zero);
  1940.             Put (" THE ESTIMATED LOSS OF BASE ");
  1941.             Put (Ibeta, 4);
  1942.             Put (" SIGNIFICANT DIGITS IS ");
  1943.             Put (W, 4, 2, 0);
  1944.             New_Line (2);
  1945.             if J = 1 then
  1946.                 A := Pi * 0.875;
  1947.                 B := Pi * 1.125;
  1948.             else
  1949.                 A := Pi * 6.0;
  1950.                 B := A + Pi * 0.25;
  1951.             end if;
  1952.         end loop;
  1953. ------------------------------------------------------------
  1954. --                SPECIAL TESTS
  1955. ------------------------------------------------------------
  1956.         New_Line (6);
  1957.         Put (" SPECIAL TESTS");
  1958.         New_Line (3);
  1959.         Put (" THE IDENTITY    TAN(-X) = -TAN(X)    WILL BE TESTED.");
  1960.         New_Line (2);
  1961.         Put ("        X         F(X) + F(-X)");
  1962.         New_Line (2);
  1963.         for I in 1..5 loop
  1964.             X := Ran * A;
  1965.             Z := Tan (X) + Tan (- X);
  1966.             Put (X);
  1967.             Put ("    ");
  1968.             Put (Z);
  1969.             New_Line;
  1970.         end loop;
  1971.         New_Line (3);
  1972.         Put (" THE IDENTITY    TAN(X) = X   X SMALL   WILL BE TESTED.");
  1973.         New_Line (2);
  1974.         Put ("        X         X - F(X) ");
  1975.         New_Line (2);
  1976.         X := Ran / Betap;
  1977.         for I in 1..5 loop
  1978.             Z := X - Tan (X);
  1979.             Put (X);
  1980.             Put ("    ");
  1981.             Put (Z);
  1982.             New_Line;
  1983.             X := X / Beta;
  1984.         end loop;
  1985.         New_Line (3);
  1986.         Put (" TEST OF UNDERFLOW FOR VERY SMALL ARGUMENT. ");
  1987.         New_Line;
  1988.         X := Beta ** ((Minexp * 3) / 4);
  1989.         Y := Tan (X);
  1990.         Put ("       TAN(");
  1991.         Put (X);
  1992.         Put (") = ");
  1993.         Put (Y);
  1994.         New_Line (4);
  1995.         A := - 225.0;
  1996.         B := - 0.95084_64541_95142_026;
  1997.         X := 11.0;
  1998.         Y := Tan (X);
  1999.         W := ((A - Y) + B) / (A + B);
  2000.         Z := Log (abs (W)) / Albeta;
  2001.         Put (" THE RELATIVE ERROR IN TAN(11) IS ");
  2002.         Put (W, 5, 4, 2);
  2003.         Put (" = ");
  2004.         Put (Ibeta, 4);
  2005.         Put (" **");
  2006.         Put (Z, 4, 2, 0);
  2007.         Put (" WHERE ");
  2008.         New_Line;
  2009.         Put ("       TAN(");
  2010.         Put (X);
  2011.         Put (") = ");
  2012.         Put (Y);
  2013.         New_Line;
  2014.         W := Max (Ait + Z, Zero);
  2015.         Put (" THE ESTIMATED LOSS OF BASE ");
  2016.         Put (Ibeta, 4);
  2017.         Put (" SIGNIFICANT DIGITS IS ");
  2018.         Put (W, 4, 2, 0);
  2019.         New_Line (2);
  2020. ------------------------------------------------------------
  2021. --                TESTS OF ERROR RETURNS
  2022. ------------------------------------------------------------
  2023.         New_Line (6);
  2024.         Put (" TEST OF ERROR RETURNS");
  2025.         New_Line (3);
  2026.         X := Beta ** (It / 2);
  2027.         Put (" TAN WILL BE CALLED WITH THE ARGUMENT ");
  2028.         Put (X);
  2029.         New_Line;
  2030.         Put (" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  2031.         New_Line;
  2032.         Y := Tan (X);
  2033.         New_Line;
  2034.         Put (" TAN RETURNED THE VALUE ");
  2035.         Put (Y);
  2036.         New_Line (4);
  2037.         X := Betap;
  2038.         Put (" TAN WILL BE CALLED WITH THE ARGUMENT ");
  2039.         Put (X);
  2040.         New_Line;
  2041.         Put (" THIS SHOULD TRIGGER AN ERROR MESSAGE");
  2042.         New_Line;
  2043.         Y := Tan (X);
  2044.         New_Line;
  2045.         Put (" TAN RETURNED THE VALUE ");
  2046.         Put (Y);
  2047.         New_Line (4);
  2048.         Put (" THIS CONCLUDES THE TESTS");
  2049.         New_Line;
  2050.     end Test_Tan_Cot;
  2051.  
  2052. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2053. --TESTASIN
  2054. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2055.     separate (Test_Math_Functions)
  2056.     procedure Test_Asin_Acos is
  2057.         use Text_Io;
  2058.         use Integer_Io, Floating_Io;
  2059.         use Math_Functions;
  2060.         N : Integer := 2000;
  2061.         K1, K2, K3         : Integer;
  2062.         R6, R7             : Floating;
  2063.         W, X, Xl, Y, Z, Zz : Floating;
  2064.         X1 : Floating;
  2065.         A, B, C, D, Del    : Floating;
  2066.         type Routine is (F_Asin, F_Acos);
  2067.         L               : Routine;
  2068.         Sum, Xm, Ysq, S : Floating;
  2069.         C1, C2          : Floating;
  2070.         Beta            : Floating := Floating (Ibeta);
  2071.         Albeta          : Floating := Log (Beta);
  2072.         Betap           : Floating := Beta ** It;
  2073.         Ait             : Floating := Floating (It);
  2074.         Xn              : Floating := Floating (N);
  2075.         K               : 
  2076.             Integer := Integer (Log10 (Beta ** It) + 0.5) + 1;
  2077.         Half            : constant Floating := One / (One + One);
  2078.     begin
  2079.         New_Page;
  2080. -----------------------------------------------------------
  2081. --                RANDOM ARGUMENT TESTS
  2082. -----------------------------------------------------------
  2083.         for J in 1..5 loop
  2084.             K1 := 0;
  2085.             K3 := 0;
  2086.             X1 := Zero;
  2087.             R6 := Zero;
  2088.             R7 := Zero;
  2089.             case J is
  2090.                 when 1 => 
  2091.                     A  := - 0.125;
  2092.                     B  := 0.125;
  2093.                     C1 := 201.0 / 128.0;
  2094.                     C2 := 4.83826_79489_66192_3132E-4;
  2095.                     L  := F_Asin;
  2096.                 when 2 => 
  2097.                     A := - 0.125;
  2098.                     B := 0.125;
  2099.                     L := F_Acos;
  2100.                 when 3 => 
  2101.                     A := 0.75;
  2102.                     B := 1.00;
  2103.                     L := F_Asin;
  2104.                 when 4 => 
  2105.                     A := 0.75;
  2106.                     B := 1.00;
  2107.                     L := F_Acos;
  2108.                 when 5 => 
  2109.                     A  := - 1.00;
  2110.                     B  := - 0.75;
  2111.                     C1 := C1 + C1;
  2112.                     C2 := C2 + C2;
  2113.                     L  := F_Acos;
  2114.             end case;
  2115.             Del := (B - A) / Xn;
  2116.             Xl  := A;
  2117.             for I in 1..N loop
  2118.                 X := Del * Ran + Xl;
  2119.                 case J is
  2120.                     when 1 | 2 => 
  2121.                         Y   := X;
  2122.                         Ysq := Y * Y;
  2123.                     when 3 | 4 => 
  2124.                         Ysq := Half - Half * abs (X);
  2125.                         X   := (Half - (Ysq + Ysq)) + Half;
  2126.                         Y   := Sqrt (Ysq);
  2127.                         Y   := Y + Y;
  2128.                     when 5 => 
  2129.                         Ysq := Half - Half * abs (X);
  2130.                         X   := (Half - (Ysq + Ysq)) + Half;
  2131.                         X   := - X;
  2132.                         Y   := Sqrt (Ysq);
  2133.                         Y   := Y + Y;
  2134.                 end case;
  2135.                 Sum := Zero;
  2136.                 Xm  := Floating (K + K + 1);
  2137.                 case L is
  2138.                     when F_Asin => 
  2139.                         Z := Asin (X);
  2140.                     when F_Acos => 
  2141.                         Z := Acos (X);
  2142.                 end case;
  2143.                 for M in 1..K loop
  2144.                     Sum := Ysq * (Sum + 1.0 / Xm);
  2145.                     Xm  := Xm - 2.0;
  2146.                     Sum := Sum * (Xm / (Xm + 1.0));
  2147.                 end loop;
  2148.                 Sum := Sum * Y;
  2149.                 case J is
  2150.                     when 1 | 4 => 
  2151.                         Zz  := Y + Sum;
  2152.                         Sum := (Y - Zz) + Sum;
  2153.                     when 2 | 3 | 5 => 
  2154.                         S   := C1 + C2;
  2155.                         Sum := ((C1 - S) + C2) - Sum;
  2156.                         Zz  := S + Sum;
  2157.                         Sum := ((S - Zz) + Sum) - Y;
  2158.                         S   := Zz;
  2159.                         Zz  := S + Sum;
  2160.                         Sum := (S - Zz) + Sum;
  2161.                 end case;
  2162.                 if Irnd /= 1 then
  2163.                     Zz := Zz + (Sum + Sum);
  2164.                 end if;
  2165.                 W := 1.0;
  2166.                 if Z /= 0.0 then
  2167.                     W := (Z - Zz) / Z;
  2168.                 end if;
  2169.                 if W > Zero then
  2170.                     K1 := K1 + 1;
  2171.                 end if;
  2172.                 if W < Zero then
  2173.                     K3 := K3 + 1;
  2174.                 end if;
  2175.                 W := abs (W);
  2176.                 if W > R6 then
  2177.                     R6 := W;
  2178.                     X1 := X;
  2179.                 end if;
  2180.                 R7 := R7 + W * W;
  2181.                 Xl := Xl + Del;
  2182.             end loop;
  2183.             K2 := N - K1 - K3;
  2184.             R7 := Sqrt (R7 / Xn);
  2185.             New_Line (6);
  2186.             case L is
  2187.                 when F_Asin => 
  2188.                     Put (" TEST OF ASIN(X) VS TAYLOR SERIES ");
  2189.                     New_Line (3);
  2190.                     Put (N);
  2191.                     Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  2192.                     New_Line;
  2193.                     Put ("      (");
  2194.                     Put (A);
  2195.                     Put (",");
  2196.                     Put (B);
  2197.                     Put (")");
  2198.                     New_Line;
  2199.                     Put ("   ASIN(X) WAS LARGER  ");
  2200.                     Put (K1);
  2201.                     Put (" TIMES");
  2202.                     New_Line;
  2203.                     Put ("               AGREED  ");
  2204.                     Put (K2);
  2205.                     Put (" TIMES");
  2206.                     New_Line;
  2207.                     Put ("          WAS SMALLER  ");
  2208.                     Put (K3);
  2209.                     Put (" TIMES");
  2210.                     New_Line (3);
  2211.                 when F_Acos => 
  2212.                     Put (" TEST OF ACOS(X) VS TAYLOR SERIES ");
  2213.                     New_Line (3);
  2214.                     Put (N);
  2215.                     Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  2216.                     New_Line;
  2217.                     Put ("      (");
  2218.                     Put (A);
  2219.                     Put (",");
  2220.                     Put (B);
  2221.                     Put (")");
  2222.                     New_Line;
  2223.                     Put ("   ACOS(X) WAS LARGER  ");
  2224.                     Put (K1);
  2225.                     Put (" TIMES");
  2226.                     New_Line;
  2227.                     Put ("               AGREED  ");
  2228.                     Put (K2);
  2229.                     Put (" TIMES");
  2230.                     New_Line;
  2231.                     Put ("          WAS SMALLER  ");
  2232.                     Put (K3);
  2233.                     Put (" TIMES");
  2234.                     New_Line (3);
  2235.             end case;
  2236.             Put (" THERE ARE ");
  2237.             Put (It, 4);
  2238.             Put (" BASE ");
  2239.             Put (Ibeta, 4);
  2240.             Put (" SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER");
  2241.             New_Line (3);
  2242.             W := - 999.0E0;
  2243.             if (R6 /= Zero) then
  2244.                 W := Log (abs (R6)) / Albeta;
  2245.             end if;
  2246.             Put (" THE MAXIMUM RELATIVE ERROR OF ");
  2247.             Put (R6, 5, 4, 2);
  2248.             Put (" = ");
  2249.             Put (Ibeta, 4);
  2250.             Put (" **");
  2251.             Put (W, 4, 2, 0);
  2252.             New_Line;
  2253.             Put ("    OCCURED FOR X = ");
  2254.             Put (X1);
  2255.             New_Line;
  2256.             W := Max (Ait + W, Zero);
  2257.             Put (" THE ESTIMATED LOSS OF BASE ");
  2258.             Put (Ibeta, 4);
  2259.             Put (" SIGNIFICANT DIGITS IS ");
  2260.             Put (W, 4, 2, 0);
  2261.             New_Line (2);
  2262.             W := - 999.0E0;
  2263.             if (R7 /= Zero) then
  2264.                 W := Log (abs (R7)) / Albeta;
  2265.             end if;
  2266.             Put (" THE ROOT MEAN SQUARE RELATIVE ERROR WAS ");
  2267.             Put (R7, 5, 4, 2);
  2268.             Put (" = ");
  2269.             Put (Ibeta, 4);
  2270.             Put (" **");
  2271.             Put (W, 4, 2, 0);
  2272.             New_Line;
  2273.             W := Max (Ait + W, Zero);
  2274.             Put (" THE ESTIMATED LOSS OF BASE ");
  2275.             Put (Ibeta, 4);
  2276.             Put (" SIGNIFICANT DIGITS IS ");
  2277.             Put (W, 4, 2, 0);
  2278.             New_Line (2);
  2279.         end loop;
  2280. ------------------------------------------------------------
  2281. --                SPECIAL TESTS
  2282. ------------------------------------------------------------
  2283.         New_Line (6);
  2284.         Put (" SPECIAL TESTS");
  2285.         New_Line (3);
  2286.         Put (" THE IDENTITY    ASIN(-X) = -ASIN(X)    WILL BE TESTED.");
  2287.         New_Line (2);
  2288.         Put ("        X         F(X) + F(-X)");
  2289.         New_Line (2);
  2290.         for I in 1..5 loop
  2291.             X := Ran * A;
  2292.             Z := Asin (X) + Asin (- X);
  2293.             Put (X);
  2294.             Put ("    ");
  2295.             Put (Z);
  2296.             New_Line;
  2297.         end loop;
  2298.         New_Line (3);
  2299.         Put (" THE IDENTITY    ASIN(X) = X   X SMALL   WILL BE TESTED.");
  2300.         New_Line (2);
  2301.         Put ("        X         X - F(X) ");
  2302.         New_Line (2);
  2303.         X := Ran / Betap;
  2304.         for I in 1..5 loop
  2305.             Z := X - Asin (X);
  2306.             Put (X);
  2307.             Put ("    ");
  2308.             Put (Z);
  2309.             New_Line;
  2310.             X := X / Beta;
  2311.         end loop;
  2312.         New_Line (3);
  2313.         Put (" TEST OF UNDERFLOW FOR VERY SMALL ARGUMENT. ");
  2314.         New_Line;
  2315.         X := Beta ** ((Minexp * 3) / 4);
  2316.         Y := Asin (X);
  2317.         Put ("       ASIN(");
  2318.         Put (X);
  2319.         Put (") = ");
  2320.         Put (Y);
  2321.         New_Line (4);
  2322. ------------------------------------------------------------
  2323. --                TESTS OF ERROR RETURNS
  2324. ------------------------------------------------------------
  2325.         New_Line (6);
  2326.         Put (" TEST OF ERROR RETURNS");
  2327.         New_Line (3);
  2328.         X := 1.2;
  2329.         Put (" ASIN WILL BE CALLED WITH THE ARGUMENT ");
  2330.         Put (X);
  2331.         New_Line;
  2332.         Put (" THIS SHOULD TRIGGER AN ERROR MESSAGE");
  2333.         New_Line;
  2334.         Y := Asin (X);
  2335.         New_Line;
  2336.         Put (" ASIN RETURNED THE VALUE ");
  2337.         Put (Y);
  2338.         New_Line (3);
  2339.         Put (" THIS CONCLUDES THE TESTS");
  2340.         New_Line;
  2341.     end Test_Asin_Acos;
  2342.  
  2343. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2344. --TESTATAN
  2345. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2346.     separate (Test_Math_Functions)
  2347.     procedure Test_Atan is
  2348.         use Text_Io;
  2349.         use Integer_Io, Floating_Io;
  2350.         use Math_Functions;
  2351.         N : Integer := 2000;
  2352.         K1, K2, K3         : Integer;
  2353.         R6, R7             : Floating;
  2354.         W, X, Xl, Y, Z, Zz : Floating;
  2355.         X1 : Floating;
  2356.         A, B, C, D, Del    : Floating;
  2357.         Sum, Xsq, Ob32, Em : Floating;
  2358.         Beta               : Floating := Floating (Ibeta);
  2359.         Albeta             : Floating := Log (Beta);
  2360.         Betap              : Floating := Beta ** It;
  2361.         Ait                : Floating := Floating (It);
  2362.         Xn : Floating := Floating (N);
  2363.         Two                : constant Floating := One + One;
  2364.         Half               : constant Floating := One / Two;
  2365.     begin
  2366.         New_Page;
  2367. -----------------------------------------------------------
  2368. --                RANDOM ARGUMENT TESTS
  2369. -----------------------------------------------------------
  2370.         for J in 1..4 loop
  2371.             K1 := 0;
  2372.             K3 := 0;
  2373.             X1 := Zero;
  2374.             R6 := Zero;
  2375.             R7 := Zero;
  2376.             case J is
  2377.                 when 1 => 
  2378.                     A    := - 0.0625;
  2379.                     B    := - A;
  2380.                     Ob32 := B * Half;
  2381.                 when 2 => 
  2382.                     A := B;
  2383.                     B := Two - Sqrt (3.0);
  2384.                 when 3 => 
  2385.                     A := B;
  2386.                     B := Sqrt (2.0) - One;
  2387.                 when 4 => 
  2388.                     A := B;
  2389.                     B := One;
  2390.             end case;
  2391.             Del := (B - A) / Xn;
  2392.             Xl  := A;
  2393.             for I in 1..N loop
  2394.                 X := Del * Ran + Xl;
  2395.                 case J is
  2396.                     when 1 => 
  2397.                         Z   := Atan (X);
  2398.                         Xsq := X * X;
  2399.                         Em  := 17.0;
  2400.                         Sum := Xsq / Em;
  2401.                         for Ii in 1..7 loop
  2402.                             Em  := Em - Two;
  2403.                             Sum := (One / Em - Sum) * Xsq;
  2404.                         end loop;
  2405.                         Sum := - X * Sum;
  2406.                         Zz  := X + Sum;
  2407.                         Sum := (X - Zz) + Sum;
  2408.                         if Irnd = 0 then
  2409.                             Zz := Zz + (Sum + Sum);
  2410.                         end if;
  2411.                     when 2 => 
  2412.                         X  := ((One + X * A) - One) * 16.0;
  2413.                         Z  := Atan (X);
  2414.                         Y  := X - 0.0625;
  2415.                         Y  := Y / (One + X * A);
  2416.                         Zz := (Atan (Y) - 8.11900_04042_65152_6021E-5) + Ob32;
  2417.                         Zz := Zz + Ob32;
  2418.                     when 3..4 => 
  2419.                         Z  := Atan (X);
  2420.                         Z  := Z + Z;
  2421.                         Y  := X / ((Half + X * Half) * ((Half - X) + Half));
  2422.                         Zz := Atan (Y);
  2423.                 end case;
  2424.                 W := 1.0;
  2425.                 if Z /= 0.0 then
  2426.                     W := (Z - Zz) / Z;
  2427.                 end if;
  2428.                 if W > Zero then
  2429.                     K1 := K1 + 1;
  2430.                 end if;
  2431.                 if W < Zero then
  2432.                     K3 := K3 + 1;
  2433.                 end if;
  2434.                 W := abs (W);
  2435.                 if W > R6 then
  2436.                     R6 := W;
  2437.                     X1 := X;
  2438.                 end if;
  2439.                 R7 := R7 + W * W;
  2440.                 Xl := Xl + Del;
  2441.             end loop;
  2442.             K2 := N - K1 - K3;
  2443.             R7 := Sqrt (R7 / Xn);
  2444.             New_Line (6);
  2445.             case J is
  2446.                 when 1 => 
  2447.                     Put (" TEST OF ATAN(X) VS TRUNCATED TAYLOR SERIES ");
  2448.                 when 2 => 
  2449.                     Put (" TEST OF ATAN(X) VS ATAN(1/16) + ATAN((X-1/16)/(1+X/16))");
  2450.                 when 3..4 => 
  2451.                     Put (" TEST OF 2*ATAN(X) VS ATAN(2X/(1-X*X))");
  2452.             end case;
  2453.             New_Line (3);
  2454.             Put (N);
  2455.             Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  2456.             New_Line;
  2457.             Put ("      (");
  2458.             Put (A);
  2459.             Put (",");
  2460.             Put (B);
  2461.             Put (")");
  2462.             New_Line;
  2463.             Put ("   ATAN(X) WAS LARGER  ");
  2464.             Put (K1);
  2465.             Put (" TIMES");
  2466.             New_Line;
  2467.             Put ("               AGREED  ");
  2468.             Put (K2);
  2469.             Put (" TIMES");
  2470.             New_Line;
  2471.             Put ("          WAS SMALLER  ");
  2472.             Put (K3);
  2473.             Put (" TIMES");
  2474.             New_Line (3);
  2475.             Put (" THERE ARE ");
  2476.             Put (It, 4);
  2477.             Put (" BASE ");
  2478.             Put (Ibeta, 4);
  2479.             Put (" SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER");
  2480.             New_Line (3);
  2481.             W := - 999.0E0;
  2482.             if (R6 /= Zero) then
  2483.                 W := Log (abs (R6)) / Albeta;
  2484.             end if;
  2485.             Put (" THE MAXIMUM RELATIVE ERROR OF ");
  2486.             Put (R6, 5, 4, 2);
  2487.             Put (" = ");
  2488.             Put (Ibeta, 4);
  2489.             Put (" **");
  2490.             Put (W, 4, 2, 0);
  2491.             New_Line;
  2492.             Put ("    OCCURED FOR X = ");
  2493.             Put (X1);
  2494.             New_Line;
  2495.             W := Max (Ait + W, Zero);
  2496.             Put (" THE ESTIMATED LOSS OF BASE ");
  2497.             Put (Ibeta, 4);
  2498.             Put (" SIGNIFICANT DIGITS IS ");
  2499.             Put (W, 4, 2, 0);
  2500.             New_Line (2);
  2501.             W := - 999.0E0;
  2502.             if (R7 /= Zero) then
  2503.                 W := Log (abs (R7)) / Albeta;
  2504.             end if;
  2505.             Put (" THE ROOT MEAN SQUARE RELATIVE ERROR WAS ");
  2506.             Put (R7, 5, 4, 2);
  2507.             Put (" = ");
  2508.             Put (Ibeta, 4);
  2509.             Put (" **");
  2510.             Put (W, 4, 2, 0);
  2511.             New_Line;
  2512.             W := Max (Ait + W, Zero);
  2513.             Put (" THE ESTIMATED LOSS OF BASE ");
  2514.             Put (Ibeta, 4);
  2515.             Put (" SIGNIFICANT DIGITS IS ");
  2516.             Put (W, 4, 2, 0);
  2517.             New_Line (2);
  2518.         end loop;
  2519. ------------------------------------------------------------
  2520. --                SPECIAL TESTS
  2521. ------------------------------------------------------------
  2522.         New_Line (6);
  2523.         Put (" SPECIAL TESTS");
  2524.         New_Line (3);
  2525.         Put (" THE IDENTITY    ATAN(-X) = -ATAN(X)    WILL BE TESTED.");
  2526.         New_Line (2);
  2527.         Put ("        X         F(X) + F(-X)");
  2528.         New_Line (2);
  2529.         for I in 1..5 loop
  2530.             X := Ran * A;
  2531.             Z := Atan (X) + Atan (- X);
  2532.             Put (X);
  2533.             Put ("    ");
  2534.             Put (Z);
  2535.             New_Line;
  2536.         end loop;
  2537.         New_Line (3);
  2538.         Put (" THE IDENTITY    ATAN(X) = X   X SMALL   WILL BE TESTED.");
  2539.         New_Line (2);
  2540.         Put ("        X         X - F(X) ");
  2541.         New_Line (2);
  2542.         X := Ran / Betap;
  2543.         for I in 1..5 loop
  2544.             Z := X - Atan (X);
  2545.             Put (X);
  2546.             Put ("    ");
  2547.             Put (Z);
  2548.             New_Line;
  2549.             X := X / Beta;
  2550.         end loop;
  2551.         New_Line (3);
  2552.         Put (" THE IDENTITY    ATAN(X/Y) = ATAN2(X,Y)    WILL BE TESTED");
  2553.         New_Line;
  2554.         Put (" THE FIRST COLUMN OF RESULTS SHOULD BE 0, THE SECOND +-PI");
  2555.         New_Line (2);
  2556.         Put ("        X              Y       ");
  2557.         Put ("F1(X/Y)-F2(X,Y)  F1(X/Y)-F2(X/(-Y))");
  2558.         New_Line (2);
  2559.         A := - 2.0;
  2560.         B := 4.0;
  2561.         for I in 1..5 loop
  2562.             X  := Ran * B + A;
  2563.             Y  := Ran;
  2564.             W  := - Y;
  2565.             Z  := Atan (X / Y) - Atan2 (X, Y);
  2566.             Zz := Atan (X / W) - Atan2 (X, W);
  2567.             Put (X);
  2568.             Put ("    ");
  2569.             Put (Y);
  2570.             Put ("    ");
  2571.             Put (Z);
  2572.             Put ("    ");
  2573.             Put (Zz);
  2574.             New_Line;
  2575.         end loop;
  2576.         New_Line (3);
  2577.         Put (" TEST OF UNDERFLOW FOR VERY SMALL ARGUMENT. ");
  2578.         New_Line;
  2579.         X := Beta ** ((Minexp * 3) / 4);
  2580.         Y := Atan (X);
  2581.         Put ("       ATAN(");
  2582.         Put (X);
  2583.         Put (") = ");
  2584.         Put (Y);
  2585.         New_Line (4);
  2586. ------------------------------------------------------------
  2587. --                TESTS OF ERROR RETURNS
  2588. ------------------------------------------------------------
  2589.         New_Line (6);
  2590.         Put (" TEST OF ERROR RETURNS");
  2591.         New_Line (3);
  2592.         X := Xmax;
  2593.         Put (" ATAN WILL BE CALLED WITH THE ARGUMENT ");
  2594.         Put (X);
  2595.         New_Line;
  2596.         Put (" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  2597.         New_Line;
  2598.         Z := Atan (X);
  2599.         New_Line;
  2600.         Put (" ATAN RETURNED THE VALUE ");
  2601.         Put (Z);
  2602.         New_Line (4);
  2603.         X := One;
  2604.         Y := Zero;
  2605.         Put (" ATAN2 WILL BE CALLED WITH THE ARGUMENTS ");
  2606.         Put (X);
  2607.         Put ("    ");
  2608.         Put (Y);
  2609.         New_Line;
  2610.         Put (" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  2611.         New_Line;
  2612.         Z := Atan2 (X, Y);
  2613.         New_Line;
  2614.         Put (" ATAN2 RETURNED THE VALUE ");
  2615.         Put (Z);
  2616.         New_Line (4);
  2617.         X := Xmin;
  2618.         Y := Xmax;
  2619.         Put (" ATAN2 WILL BE CALLED WITH THE ARGUMENTS ");
  2620.         Put (X);
  2621.         Put ("    ");
  2622.         Put (Y);
  2623.         New_Line;
  2624.         Put (" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  2625.         New_Line;
  2626.         Z := Atan2 (X, Y);
  2627.         New_Line;
  2628.         Put (" ATAN2 RETURNED THE VALUE ");
  2629.         Put (Z);
  2630.         New_Line (4);
  2631.         X := Xmax;
  2632.         Y := Xmin;
  2633.         Put (" ATAN2 WILL BE CALLED WITH THE ARGUMENTS ");
  2634.         Put (X);
  2635.         Put ("    ");
  2636.         Put (Y);
  2637.         New_Line;
  2638.         Put (" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  2639.         New_Line;
  2640.         Z := Atan2 (X, Y);
  2641.         New_Line;
  2642.         Put (" ATAN2 RETURNED THE VALUE ");
  2643.         Put (Z);
  2644.         New_Line (4);
  2645.         X := Zero;
  2646.         Y := Zero;
  2647.         Put (" ATAN2 WILL BE CALLED WITH THE ARGUMENTS ");
  2648.         Put (X);
  2649.         Put ("    ");
  2650.         Put (Y);
  2651.         New_Line;
  2652.         Put (" THIS SHOULD TRIGGER AN ERROR MESSAGE");
  2653.         New_Line;
  2654.         Z := Atan2 (X, Y);
  2655.         New_Line;
  2656.         Put (" ATAN2 RETURNED THE VALUE ");
  2657.         Put (Z);
  2658.         New_Line (4);
  2659.         Put (" THIS CONCLUDES THE TESTS");
  2660.         New_Line;
  2661.     end Test_Atan;
  2662.  
  2663. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2664. --TESTSINH
  2665. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2666.     separate (Test_Math_Functions)
  2667.     procedure Test_Sinh_Cosh is
  2668.         use Text_Io;
  2669.         use Integer_Io, Floating_Io;
  2670.         use Math_Functions;
  2671.         Two                : constant Floating := One + One;
  2672.         Three              : constant Floating := One + One + One;
  2673.         Half               : constant Floating := One / Two;
  2674.         N : Integer := 2000;
  2675.         K1, K2, K3         : Integer;
  2676.         I2 : Integer;
  2677.         R6, R7             : Floating;
  2678.         W, X, Xl, Y, Z, Zz : Floating;
  2679.         X1 : Floating;
  2680.         Xn : Floating := Floating (N);
  2681.         A, B, C, D, Del    : Floating;
  2682.         Den, Xsq           : Floating;
  2683.         Nit                : Integer 
  2684.                            := 2 - Integer (Truncate (Log (Eps) * Three)) / 20;
  2685.         Aind               : Floating := Floating (Nit + Nit + 1);
  2686.         Beta               : Floating := Floating (Ibeta);
  2687.         Alxmax             : Floating := Log (Xmax);
  2688.         Albeta             : Floating := Log (Beta);
  2689.         Ait                : Floating := Floating (It);
  2690.         Betap              : Floating := Beta ** It;
  2691.         C0 : Floating := 5.0 / 16.0 + 1.15271_36831_94269_979E-2;
  2692.     begin
  2693.         New_Page;
  2694. -----------------------------------------------------------
  2695. --                RANDOM ARGUMENT TESTS
  2696. -----------------------------------------------------------
  2697.         for J in 1..4 loop
  2698.             K1 := 0;
  2699.             K3 := 0;
  2700.             X1 := Zero;
  2701.             R6 := Zero;
  2702.             R7 := Zero;
  2703.             case J is
  2704.                 when 1 => 
  2705.                     A := Zero;
  2706.                     B := Half;
  2707.                 when 2 => 
  2708.                     A    := Zero;
  2709.                     B    := Half;
  2710.                     Aind := Aind - One;
  2711.                 when 3..4 => 
  2712.                     A := Three;
  2713.                     B := Alxmax;
  2714.             end case;
  2715.             Del := (B - A) / Xn;
  2716.             Xl  := A;
  2717.             for I in 1..N loop
  2718.                 X := Del * Ran + Xl;
  2719.                 case J is
  2720.                     when 1 => 
  2721.                         Xsq := X * X;
  2722.                         Zz  := One;
  2723.                         Den := Aind;
  2724.                         for Ii in 2..Nit loop
  2725.                             W   := Zz * Xsq / (Den * (Den - One));
  2726.                             Zz  := W + One;
  2727.                             Den := Den - Two;
  2728.                         end loop;
  2729.                         W  := X * Xsq * Zz / 6.0;
  2730.                         Zz := X + W;
  2731.                         Z  := Sinh (X);
  2732.                         if Irnd = 0 then
  2733.                             W  := (X - Zz) + W;
  2734.                             Zz := Zz + (W + W);
  2735.                         end if;
  2736.                     when 2 => 
  2737.                         Xsq := X * X;
  2738.                         Zz  := One;
  2739.                         Den := Aind;
  2740.                         for Ii in 1..Nit loop
  2741.                             W   := Zz * Xsq / (Den * (Den - One));
  2742.                             Zz  := W + One;
  2743.                             Den := Den - Two;
  2744.                         end loop;
  2745.                         Z := Cosh (X);
  2746.                         if Irnd = 0 then
  2747.                             W  := (One - Zz) + W;
  2748.                             Zz := Zz + (W + W);
  2749.                         end if;
  2750.                     when 3 => 
  2751.                         Y  := X;
  2752.                         X  := Y - One;
  2753.                         W  := X - One;
  2754.                         Z  := Sinh (X);
  2755.                         Zz := (Sinh (Y) + Sinh (W)) * C0;
  2756.                     when 4 => 
  2757.                         Y  := X;
  2758.                         X  := Y - One;
  2759.                         W  := X - One;
  2760.                         Z  := Cosh (X);
  2761.                         Zz := (Cosh (Y) + Cosh (W)) * C0;
  2762.                 end case;
  2763.                 W := 1.0;
  2764.                 if Z /= 0.0 then
  2765.                     W := (Z - Zz) / Z;
  2766.                 end if;
  2767.                 if W > Zero then
  2768.                     K1 := K1 + 1;
  2769.                 end if;
  2770.                 if W < Zero then
  2771.                     K3 := K3 + 1;
  2772.                 end if;
  2773.                 W := abs (W);
  2774.                 if W > R6 then
  2775.                     R6 := W;
  2776.                     X1 := X;
  2777.                 end if;
  2778.                 R7 := R7 + W * W;
  2779.                 Xl := Xl + Del;
  2780.             end loop;
  2781.             K2 := N - K1 - K3;
  2782.             R7 := Sqrt (R7 / Xn);
  2783.             New_Line (6);
  2784.             case J is
  2785.                 when 1 => 
  2786.                     Put (" TEST OF SINH(X) VS TAYLOR SERIES EXPANSION OF SINH(X) ");
  2787.                 when 2 => 
  2788.                     Put (" TEST OF COSH(X) VS TAYLOR SERIES EXPANSION OF COSH(X) ");
  2789.                 when 3 => 
  2790.                     Put (" TEST OF SINH(X) VS C * (SINH(X+1) + SINH(X-1)) ");
  2791.                 when 4 => 
  2792.                     Put (" TEST OF COSH(X) VS C * (COSH(X+1) + COSH(X-1)) ");
  2793.             end case;
  2794.             New_Line (3);
  2795.             Put (N);
  2796.             Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  2797.             New_Line;
  2798.             Put ("      (");
  2799.             Put (A);
  2800.             Put (",");
  2801.             Put (B);
  2802.             Put (")");
  2803.             New_Line;
  2804.             case J is
  2805.                 when 1 | 3 => 
  2806.                     Put ("   SINH(X)");
  2807.                 when 2 | 4 => 
  2808.                     Put ("   COSH(X)");
  2809.             end case;
  2810.             Put (" WAS LARGER  ");
  2811.             Put (K1);
  2812.             Put (" TIMES");
  2813.             New_Line;
  2814.             Put ("               AGREED  ");
  2815.             Put (K2);
  2816.             Put (" TIMES");
  2817.             New_Line;
  2818.             Put ("          WAS SMALLER  ");
  2819.             Put (K3);
  2820.             Put (" TIMES");
  2821.             New_Line (3);
  2822.             Put (" THERE ARE ");
  2823.             Put (It, 4);
  2824.             Put (" BASE ");
  2825.             Put (Ibeta, 4);
  2826.             Put (" SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER");
  2827.             New_Line (3);
  2828.             W := - 999.0E0;
  2829.             if (R6 /= Zero) then
  2830.                 W := Log (abs (R6)) / Albeta;
  2831.             end if;
  2832.             Put (" THE MAXIMUM RELATIVE ERROR OF ");
  2833.             Put (R6, 5, 4, 2);
  2834.             Put (" = ");
  2835.             Put (Ibeta, 4);
  2836.             Put (" **");
  2837.             Put (W, 4, 2, 0);
  2838.             New_Line;
  2839.             Put ("    OCCURED FOR X = ");
  2840.             Put (X1);
  2841.             New_Line;
  2842.             W := Max (Ait + W, Zero);
  2843.             Put (" THE ESTIMATED LOSS OF BASE ");
  2844.             Put (Ibeta, 4);
  2845.             Put (" SIGNIFICANT DIGITS IS ");
  2846.             Put (W, 4, 2, 0);
  2847.             New_Line (2);
  2848.             W := - 999.0E0;
  2849.             if (R7 /= Zero) then
  2850.                 W := Log (abs (R7)) / Albeta;
  2851.             end if;
  2852.             Put (" THE ROOT MEAN SQUARE RELATIVE ERROR WAS ");
  2853.             Put (R7, 5, 4, 2);
  2854.             Put (" = ");
  2855.             Put (Ibeta, 4);
  2856.             Put (" **");
  2857.             Put (W, 4, 2, 0);
  2858.             New_Line;
  2859.             W := Max (Ait + W, Zero);
  2860.             Put (" THE ESTIMATED LOSS OF BASE ");
  2861.             Put (Ibeta, 4);
  2862.             Put (" SIGNIFICANT DIGITS IS ");
  2863.             Put (W, 4, 2, 0);
  2864.             New_Line (2);
  2865.         end loop;
  2866. ------------------------------------------------------------
  2867. --                SPECIAL TESTS
  2868. ------------------------------------------------------------
  2869.         New_Line (6);
  2870.         Put (" SPECIAL TESTS");
  2871.         New_Line (3);
  2872.         Put (" THE IDENTITY    SINH(-X) = -SINH(X)    WILL BE TESTED.");
  2873.         New_Line (2);
  2874.         Put ("        X         F(X) + F(-X)");
  2875.         New_Line (2);
  2876.         for I in 1..5 loop
  2877.             X := Ran * A;
  2878.             Z := Sinh (X) + Sinh (- X);
  2879.             Put (X);
  2880.             Put ("    ");
  2881.             Put (Z);
  2882.             New_Line;
  2883.         end loop;
  2884.         New_Line (3);
  2885.         Put (" THE IDENTITY    SINH(X) = X   X SMALL   WILL BE TESTED.");
  2886.         New_Line (2);
  2887.         Put ("        X         X - F(X) ");
  2888.         New_Line (2);
  2889.         X := Ran / Betap;
  2890.         for I in 1..5 loop
  2891.             Z := X - Sinh (X);
  2892.             Put (X);
  2893.             Put ("    ");
  2894.             Put (Z);
  2895.             New_Line;
  2896.             X := X / Beta;
  2897.         end loop;
  2898.         New_Line (3);
  2899.         Put (" THE IDENTITY    COSH(-X) = COSH(X)    WILL BE TESTED.");
  2900.         New_Line (2);
  2901.         Put ("        X         F(X) + F(-X)");
  2902.         New_Line (2);
  2903.         for I in 1..5 loop
  2904.             X := Ran * A;
  2905.             Z := Cosh (X) - Cosh (- X);
  2906.             Put (X);
  2907.             Put ("    ");
  2908.             Put (Z);
  2909.             New_Line;
  2910.         end loop;
  2911.         New_Line (3);
  2912.         Put (" TEST OF UNDERFLOW FOR VERY SMALL ARGUMENT. ");
  2913.         New_Line;
  2914.         X := Beta ** ((Minexp * 3) / 4);
  2915.         Y := Sinh (X);
  2916.         Put ("       SINH(");
  2917.         Put (X);
  2918.         Put (") = ");
  2919.         Put (Y);
  2920.         New_Line (4);
  2921. ------------------------------------------------------------
  2922. --                TESTS OF ERROR RETURNS
  2923. ------------------------------------------------------------
  2924.         New_Line (6);
  2925.         Put (" TEST OF ERROR RETURNS");
  2926.         New_Line (3);
  2927.         X := Alxmax + 0.125;
  2928.         Put (" SINH WILL BE CALLED WITH THE ARGUMENT ");
  2929.         Put (X);
  2930.         New_Line;
  2931.         Put (" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  2932.         New_Line;
  2933.         Z := Sinh (X);
  2934.         New_Line;
  2935.         Put (" SINH RETURNED THE VALUE ");
  2936.         Put (Z);
  2937.         New_Line (4);
  2938.         X := Betap;
  2939.         Put (" SINH WILL BE CALLED WITH THE ARGUMENT ");
  2940.         Put (X);
  2941.         New_Line;
  2942.         Put (" THIS SHOULD TRIGGER AN ERROR MESSAGE");
  2943.         New_Line;
  2944.         Z := Sinh (X);
  2945.         New_Line;
  2946.         Put (" SINH RETURNED THE VALUE ");
  2947.         Put (Z);
  2948.         New_Line (4);
  2949.         Put (" THIS CONCLUDES THE TESTS");
  2950.         New_Line;
  2951.     end Test_Sinh_Cosh;
  2952.  
  2953. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2954. --TESTTANH
  2955. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2956.     separate (Test_Math_Functions)
  2957.     procedure Test_Tanh is
  2958.         use Text_Io;
  2959.         use Integer_Io, Floating_Io;
  2960.         use Math_Functions;
  2961.         N : Integer := 2000;
  2962.         K1, K2, K3         : Integer;
  2963.         I2 : Integer := 2;
  2964.         R6, R7             : Floating;
  2965.         W, X, Xl, Y, Z, Zz : Floating;
  2966.         X1 : Floating;
  2967.         A, B, C, D, Del    : Floating;
  2968.         Den, Xsq           : Floating;
  2969.         Beta               : Floating := Floating (Ibeta);
  2970.         Albeta             : Floating := Log (Beta);
  2971.         Alxmax             : Floating := Log (Xmax);
  2972.         Betap              : Floating := Beta ** It;
  2973.         Ait                : Floating := Floating (It);
  2974.         Xn : Floating := Floating (N);
  2975.         Half               : constant Floating := One / (One + One);
  2976.     begin
  2977.         New_Page;
  2978. -----------------------------------------------------------
  2979. --                RANDOM ARGUMENT TESTS
  2980. -----------------------------------------------------------
  2981.         C := 1.24353_00177_15962_0805E-1;
  2982.         D := Log (2.0) + (Ait + One) * Log (Beta) * Half;
  2983.         for J in 1..2 loop
  2984.             K1 := 0;
  2985.             K3 := 0;
  2986.             X1 := Zero;
  2987.             R6 := Zero;
  2988.             R7 := Zero;
  2989.             case J is
  2990.                 when 1 => 
  2991.                     A := 0.125;
  2992.                     B := Log (3.0) * Half;
  2993.                 when 2 => 
  2994.                     A := B + A;
  2995.                     B := D;
  2996.             end case;
  2997.             Del := (B - A) / Xn;
  2998.             Xl  := A;
  2999.             for I in 1..N loop
  3000.                 X  := Del * Ran + Xl;
  3001.                 Z  := Tanh (X);
  3002.                 Y  := X - 0.125;
  3003.                 Zz := Tanh (Y);
  3004.                 Zz := (Zz + C) / (One + C * Zz);
  3005.                 W  := 1.0;
  3006.                 if Z /= 0.0 then
  3007.                     W := (Z - Zz) / Z;
  3008.                 end if;
  3009.                 if W > Zero then
  3010.                     K1 := K1 + 1;
  3011.                 end if;
  3012.                 if W < Zero then
  3013.                     K3 := K3 + 1;
  3014.                 end if;
  3015.                 W := abs (W);
  3016.                 if W > R6 then
  3017.                     R6 := W;
  3018.                     X1 := X;
  3019.                 end if;
  3020.                 R7 := R7 + W * W;
  3021.                 Xl := Xl + Del;
  3022.             end loop;
  3023.             K2 := N - K1 - K3;
  3024.             R7 := Sqrt (R7 / Xn);
  3025.             New_Line (6);
  3026.             Put (" TEST OF TANH(X) VS ");
  3027.             Put ("(TANH(X-1/8)+TANH(1/8))/(1+TANH(X-1/8)TANH(1/8))");
  3028.             New_Line (3);
  3029.             Put (N);
  3030.             Put (" RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL ");
  3031.             New_Line;
  3032.             Put ("      (");
  3033.             Put (A);
  3034.             Put (",");
  3035.             Put (B);
  3036.             Put (")");
  3037.             New_Line;
  3038.             Put ("   TANH(X) WAS LARGER  ");
  3039.             Put (K1);
  3040.             Put (" TIMES");
  3041.             New_Line;
  3042.             Put ("               AGREED  ");
  3043.             Put (K2);
  3044.             Put (" TIMES");
  3045.             New_Line;
  3046.             Put ("          WAS SMALLER  ");
  3047.             Put (K3);
  3048.             Put (" TIMES");
  3049.             New_Line (3);
  3050.             Put (" THERE ARE ");
  3051.             Put (It, 4);
  3052.             Put (" BASE ");
  3053.             Put (Ibeta, 4);
  3054.             Put (" SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER");
  3055.             New_Line (3);
  3056.             W := - 999.0E0;
  3057.             if (R6 /= Zero) then
  3058.                 W := Log (abs (R6)) / Albeta;
  3059.             end if;
  3060.             Put (" THE MAXIMUM RELATIVE ERROR OF ");
  3061.             Put (R6, 5, 4, 2);
  3062.             Put (" = ");
  3063.             Put (Ibeta, 4);
  3064.             Put (" **");
  3065.             Put (W, 4, 2, 0);
  3066.             New_Line;
  3067.             Put ("    OCCURED FOR X = ");
  3068.             Put (X1);
  3069.             New_Line;
  3070.             W := Max (Ait + W, Zero);
  3071.             Put (" THE ESTIMATED LOSS OF BASE ");
  3072.             Put (Ibeta, 4);
  3073.             Put (" SIGNIFICANT DIGITS IS ");
  3074.             Put (W, 4, 2, 0);
  3075.             New_Line (2);
  3076.             W := - 999.0E0;
  3077.             if (R7 /= Zero) then
  3078.                 W := Log (abs (R7)) / Albeta;
  3079.             end if;
  3080.             Put (" THE ROOT MEAN SQUARE RELATIVE ERROR WAS ");
  3081.             Put (R7, 5, 4, 2);
  3082.             Put (" = ");
  3083.             Put (Ibeta, 4);
  3084.             Put (" **");
  3085.             Put (W, 4, 2, 0);
  3086.             New_Line;
  3087.             W := Max (Ait + W, Zero);
  3088.             Put (" THE ESTIMATED LOSS OF BASE ");
  3089.             Put (Ibeta, 4);
  3090.             Put (" SIGNIFICANT DIGITS IS ");
  3091.             Put (W, 4, 2, 0);
  3092.             New_Line (2);
  3093.         end loop;
  3094. ------------------------------------------------------------
  3095. --                SPECIAL TESTS
  3096. ------------------------------------------------------------
  3097.         New_Line (6);
  3098.         Put (" SPECIAL TESTS");
  3099.         New_Line (3);
  3100.         Put (" THE IDENTITY    TANH(-X) = -TANH(X)    WILL BE TESTED.");
  3101.         New_Line (2);
  3102.         Put ("        X         F(X) + F(-X)");
  3103.         New_Line (2);
  3104.         for I in 1..5 loop
  3105.             X := Ran;
  3106.             Z := Tanh (X) + Tanh (- X);
  3107.             Put (X);
  3108.             Put ("    ");
  3109.             Put (Z);
  3110.             New_Line;
  3111.         end loop;
  3112.         New_Line (3);
  3113.         Put (" THE IDENTITY    TANH(X) = X   X SMALL   WILL BE TESTED.");
  3114.         New_Line (2);
  3115.         Put ("        X         X - F(X) ");
  3116.         New_Line (2);
  3117.         X := Ran / Betap;
  3118.         for I in 1..5 loop
  3119.             Z := X - Tanh (X);
  3120.             Put (X);
  3121.             Put ("    ");
  3122.             Put (Z);
  3123.             New_Line;
  3124.             X := X / Beta;
  3125.         end loop;
  3126.         New_Line (3);
  3127.         Put (" THE IDENTITY    TANH(X) = 1   X LARGE   WILL BE TESTED.");
  3128.         New_Line (2);
  3129.         Put ("        X           F(X) - 1 ");
  3130.         New_Line (2);
  3131.         X := D;
  3132.         B := 4.0;
  3133.         for I in 1..5 loop
  3134.             Z := (Tanh (X) - Half) - Half;
  3135.             Put (X);
  3136.             Put ("    ");
  3137.             Put (Z);
  3138.             New_Line;
  3139.             X := X + B;
  3140.         end loop;
  3141.         New_Line (3);
  3142.         Put (" TEST OF UNDERFLOW FOR VERY SMALL ARGUMENT. ");
  3143.         New_Line;
  3144.         X := Beta ** ((Minexp * 3) / 4);
  3145.         Y := Tanh (X);
  3146.         Put ("       TANH(");
  3147.         Put (X);
  3148.         Put (") = ");
  3149.         Put (Y);
  3150.         New_Line (4);
  3151. ------------------------------------------------------------
  3152. --                TESTS OF ERROR RETURNS
  3153. ------------------------------------------------------------
  3154.         New_Line (6);
  3155.         Put (" TEST OF ERROR RETURNS");
  3156.         New_Line (3);
  3157.         X := Xmax;
  3158.         Put (" TANH WILL BE CALLED WITH THE ARGUMENT ");
  3159.         Put (X);
  3160.         New_Line;
  3161.         Put (" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  3162.         New_Line;
  3163.         Z := Tanh (X);
  3164.         New_Line;
  3165.         Put (" TANH RETURNED THE VALUE ");
  3166.         Put (Z);
  3167.         New_Line (4);
  3168.         X := Xmin;
  3169.         Put (" TANH WILL BE CALLED WITH THE ARGUMENT ");
  3170.         Put (X);
  3171.         New_Line;
  3172.         Put (" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  3173.         New_Line;
  3174.         Z := Tanh (X);
  3175.         New_Line;
  3176.         Put (" TANH RETURNED THE VALUE ");
  3177.         Put (Z);
  3178.         New_Line (4);
  3179.         X := Zero;
  3180.         Put (" TANH WILL BE CALLED WITH THE ARGUMENT ");
  3181.         Put (X);
  3182.         New_Line;
  3183.         Put (" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE");
  3184.         New_Line;
  3185.         Z := Tanh (X);
  3186.         New_Line;
  3187.         Put (" TANH RETURNED THE VALUE ");
  3188.         Put (Z);
  3189.         New_Line (4);
  3190.         Put (" THIS CONCLUDES THE TESTS");
  3191.         New_Line;
  3192.     end Test_Tanh;
  3193.