-- CXF2001.A
--
--                             Grant of Unlimited Rights
--
--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 
--     unlimited rights in the software and documentation contained herein.
--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making 
--     this public release, the Government intends to confer upon all 
--     recipients unlimited rights  equal to those held by the Government.  
--     These rights include rights to use, duplicate, release or disclose the 
--     released technical data and computer software in whole or in part, in 
--     any manner and for any purpose whatsoever, and to have or permit others 
--     to do so.
--
--                                    DISCLAIMER
--
--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED 
--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE 
--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
--     PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- OBJECTIVE:
--      Check that the Divide procedure provides the following results:
--        Quotient = Dividend divided by Divisor  and
--        Remainder = Dividend - (Divisor * Quotient)
--      Check that the Remainder is calculated exactly.
--
-- TEST DESCRIPTION:
--      This test is designed to test the generic procedure Divide found in
--      package Ada.Decimal.  
--
--      The table below attempts to portray the design approach used in this 
--      test.  There are three "dimensions" of concern:
--        1) the delta value of the Quotient and Remainder types, shown as
--           column headers,
--        2) specific choices for the Dividend and Divisor numerical values
--           (i.e., whether they yielded a repeating/non-terminating result,
--            or a terminating result ["exact"]), displayed on the left side 
--            of the tables, and
--        3) the delta for the Dividend and Divisor.
--      
--      Each row in the tables indicates a specific test case, showing the
--      specific quotient and remainder (under the appropriate Delta column)
--      for each combination of dividend and divisor values.  Test cases
--      follow the top-to-bottom sequence shown in the tables.
--      
--      Most of the test case sets (same dividend/divisor combinations -
--      indicated by dashed horizontal lines in the tables) vary the 
--      delta of the quotient and remainder types between test cases. This 
--      allows for an examination of how different deltas for a quotient
--      and/or remainder type can influence the results of a division with
--      identical dividend and divisor.
--      
--      Note: Test cases are performed for both Radix 10 and Radix 2 types.
--      
--      
--  Divid  Divis    Delta     Delta       Delta       Delta       Delta
-- (Delta)(Delta)|  .1   |    .01    |   .001    |   .0001   |  .00001   |Test
--               |---|---|-----|-----|-----|-----|-----|-----|-----|-----|Case
--    quotient   | Q | R |  Q  |  R  |  Q  |  R  |  Q  |  R  |  Q  |  R  | No.
-- ---------------------------------------------------------------------------
--  .05     .3   |.1             .02                                       1,21
-- (.01)   (.1)  |.1   0                                                   2,22
--               |         .16               .002                          3,23
--   0.166666..  |         .16   .00                                       4,24
--               |                     .166             .0002              5,25
-- ---------------------------------------------------------------------------
--  .15     20   |         .00                          .1500              6,26
-- (.01)    (1)  |         .00               .150                          7,27
--               |         .00   .15                                       8,28
--   0.0075      |               .01   .007                                9,29
--               |                     .007  .010                         10,30
--               |                                .0075 .0000             11,31
-- ---------------------------------------------------------------------------
--  .03125   .5  |                                .0625 .0000             12,32
-- (.00001) (.1) |                     .062                        .00025 13,33
--               |                     .062             .0002             14,34
--   0.0625      |                     .062  .000                         15,35
--               |               .00   .062                               16,36
--               |         .06                                     .00125 17,37
--               |         .06                          .0012             18,38
--               |         .06               .001                         19,39
--               |         .06   .00                                      20,40
-- ---------------------------------------------------------------------------
-- Divide by Zero| Raise Constraint_Error                                 41
-- ---------------------------------------------------------------------------
-- 
--       
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      29 Dec 94   SAIC    Modified Radix 2 cases to match Radix 10 cases.
--      03 Oct 95   RBKD    Modified to fix incorrect remainder results
--      15 Nov 95   SAIC    Incorporated reviewer fixes for ACVC 2.0.1.
--
--!

with Report;
with Ada.Decimal;

procedure CXF2001 is

   TC_Verbose : Boolean := False;

begin

   Report.Test ("CXF2001", "Check that the Divide procedure provides "  &
                           "correct results. Check that the Remainder " &
                           "is calculated exactly");
   Radix_10_Block:
   declare


      -- Declare all types and variables used in the various blocks below
      -- for all Radix 10 evaluations.

      type DT_1       is delta 1.0     digits 5; 
      type DT_0_1     is delta 0.1     digits 10; 
      type DT_0_01    is delta 0.01    digits 10; 
      type DT_0_001   is delta 0.001   digits 10; 
      type DT_0_0001  is delta 0.0001  digits 10; 
      type DT_0_00001 is delta 0.00001 digits 10; 

      for DT_1'Machine_Radix       use 10;
      for DT_0_1'Machine_Radix     use 10;
      for DT_0_01'Machine_Radix    use 10;
      for DT_0_001'Machine_Radix   use 10;
      for DT_0_0001'Machine_Radix  use 10;
      for DT_0_00001'Machine_Radix use 10;

      Dd_1,       Dv_1,       Quot_1,       Rem_1       : DT_1       := 0.0;
      Dd_0_1,     Dv_0_1,     Quot_0_1,     Rem_0_1     : DT_0_1     := 0.0;
      Dd_0_01,    Dv_0_01,    Quot_0_01,    Rem_0_01    : DT_0_01    := 0.0;
      Dd_0_001,   Dv_0_001,   Quot_0_001,   Rem_0_001   : DT_0_001   := 0.0;
      Dd_0_0001,  Dv_0_0001,  Quot_0_0001,  Rem_0_0001  : DT_0_0001  := 0.0;
      Dd_0_00001, Dv_0_00001, Quot_0_00001, Rem_0_00001 : DT_0_00001 := 0.0;

   begin 


      declare
         procedure Div is 
            new Ada.Decimal.Divide(Dividend_Type  => DT_0_01,
                                   Divisor_Type   => DT_0_1,
                                   Quotient_Type  => DT_0_1,
                                   Remainder_Type => DT_0_01);
      begin
         if TC_Verbose then Report.Comment("Case 1"); end if;
         Dd_0_01 := DT_0_01(0.05);  Dv_0_1 := DT_0_1(0.3);
         Div(Dd_0_01, Dv_0_1, Quot_0_1, Rem_0_01);
         if Quot_0_1 /= DT_0_1(0.1)  or  Rem_0_01 /= DT_0_01(0.02) then
            Report.Failed("Incorrect values returned, Case 1");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_0_1, DT_0_1, DT_0_1);
      begin
         if TC_Verbose then Report.Comment("Case 2"); end if;
         Dd_0_01 := DT_0_01(0.05);   Dv_0_1 := DT_0_1(0.3);
         Div(Dd_0_01, Dv_0_1, Quot_0_1, Rem_0_1);
         if Quot_0_1 /= DT_0_1(0.1) or  Rem_0_1 /= DT_0_1(0.0) then
            Report.Failed("Incorrect values returned, Case 2");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_0_1, DT_0_01, DT_0_001);
      begin
         if TC_Verbose then Report.Comment("Case 3"); end if;
         Dd_0_01 := DT_0_01(0.05);  Dv_0_1 := DT_0_1(0.3);
         Div(Dd_0_01, Dv_0_1, Quot_0_01, Rem_0_001);
         if Quot_0_01 /= DT_0_01(0.16) or  Rem_0_001 /= DT_0_001(0.002) then
            Report.Failed("Incorrect values returned, Case 3");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_0_1, DT_0_01, DT_0_01);
      begin
         if TC_Verbose then Report.Comment("Case 4"); end if;
         Dd_0_01 := DT_0_01(0.05);  Dv_0_1 := DT_0_1(0.3);
         Div(Dd_0_01, Dv_0_1, Quot_0_01, Rem_0_01);
         if Quot_0_01 /= DT_0_01(0.16) or  Rem_0_01 /= DT_0_01(0.0) then
            Report.Failed("Incorrect values returned, Case 4");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_0_1, DT_0_001, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 5"); end if;
         Dd_0_01 := DT_0_01(0.05);  Dv_0_1 := DT_0_1(0.3);
         Div(Dd_0_01, Dv_0_1, Quot_0_001, Rem_0_0001);
         if Quot_0_001 /= DT_0_001(0.166)   or 
            Rem_0_0001 /= DT_0_0001(0.0002) 
         then
            Report.Failed("Incorrect values returned, Case 5");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_1, DT_0_01, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 6"); end if;
         Dd_0_01 := DT_0_01(0.15);  Dv_1 := DT_1(20);
         Div(Dd_0_01, Dv_1, Quot_0_01, Rem_0_0001);
         if Quot_0_01 /= DT_0_01(0.0) or Rem_0_0001 /= DT_0_0001(0.1500) then
            Report.Failed("Incorrect values returned, Case 6");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_1, DT_0_01, DT_0_001);
      begin
         if TC_Verbose then Report.Comment("Case 7"); end if;
         Dd_0_01 := DT_0_01(0.15);  Dv_1 := DT_1(20);
         Div(Dd_0_01, Dv_1, Quot_0_01, Rem_0_001);
         if Quot_0_01 /= DT_0_01(0.0) or Rem_0_001 /= DT_0_001(0.150) then
            Report.Failed("Incorrect values returned, Case 7");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_1, DT_0_01, DT_0_01);
      begin
         if TC_Verbose then Report.Comment("Case 8"); end if;
         Dd_0_01 := DT_0_01(0.15);  Dv_1 := DT_1(20);
         Div(Dd_0_01, Dv_1, Quot_0_01, Rem_0_01);
         if Quot_0_01 /= DT_0_01(0.0) or Rem_0_01 /= DT_0_01(0.15) then
            Report.Failed("Incorrect values returned, Case 8");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_1, DT_0_001, DT_0_001);
      begin
         if TC_Verbose then Report.Comment("Case 9"); end if;
         Dd_0_01 := DT_0_01(0.15);  Dv_1 := DT_1(20);
         Div(Dd_0_01, Dv_1, Quot_0_001, Rem_0_001);
         if Quot_0_001 /= DT_0_001(0.007) or  Rem_0_001 /= DT_0_001(0.01) then
            Report.Failed("Incorrect values returned, Case 9");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_1, DT_0_001, DT_0_01);
      begin
         if TC_Verbose then Report.Comment("Case 10"); end if;
         Dd_0_01 := DT_0_01(0.15);  Dv_1 := DT_1(20);
         Div(Dd_0_01, Dv_1, Quot_0_001, Rem_0_01);
         if Quot_0_001 /= DT_0_001(0.007) or  Rem_0_01 /= DT_0_01(0.01) then
            Report.Failed("Incorrect values returned, Case 10");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_1, DT_0_0001, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 11"); end if;
         Dd_0_01 := DT_0_01(0.15);  Dv_1 := DT_1(20);
         Div(Dd_0_01, Dv_1, Quot_0_0001, Rem_0_0001);
         if Quot_0_0001 /= DT_0_0001(0.0075) or 
            Rem_0_0001  /= DT_0_0001(0.0) 
         then
            Report.Failed("Incorrect values returned, Case 11");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_0001, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 12"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_0001, Rem_0_0001);
         if Quot_0_0001 /= DT_0_0001(0.0625) or 
            Rem_0_0001  /= DT_0_0001(0.0) 
         then
            Report.Failed("Incorrect values returned, Case 12");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_001, DT_0_00001);
      begin
         if TC_Verbose then Report.Comment("Case 13"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_001, Rem_0_00001);
         if Quot_0_001 /= DT_0_001(0.062) or 
            Rem_0_00001  /= DT_0_00001(0.00025)
         then
            Report.Failed("Incorrect values returned, Case 13");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_001, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 14"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_001, Rem_0_0001);
         if Quot_0_001 /= DT_0_001(0.062) or 
            Rem_0_0001  /= DT_0_0001(0.0002)
         then
            Report.Failed("Incorrect values returned, Case 14");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_001, DT_0_001);
      begin
         if TC_Verbose then Report.Comment("Case 15"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_001, Rem_0_001);
         if Quot_0_001 /= DT_0_001(0.062) or Rem_0_001 /= DT_0_001(0.000)
         then
            Report.Failed("Incorrect values returned, Case 15");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_001, DT_0_01);
      begin
         if TC_Verbose then Report.Comment("Case 16"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_001, Rem_0_01);
         if Quot_0_001 /= DT_0_001(0.062) or Rem_0_01 /= DT_0_01(0.00) then
            Report.Failed("Incorrect values returned, Case 16");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_01, DT_0_00001);
      begin
         if TC_Verbose then Report.Comment("Case 17"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_01, Rem_0_00001);
         if Quot_0_01 /= DT_0_01(0.06) or Rem_0_00001 /= DT_0_00001(0.00125) 
         then
            Report.Failed("Incorrect values returned, Case 17");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_01, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 18"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_01, Rem_0_0001);
         if Quot_0_01 /= DT_0_01(0.06) or Rem_0_0001 /= DT_0_0001(0.0012) 
         then
            Report.Failed("Incorrect values returned, Case 18");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_01, DT_0_001);
      begin
         if TC_Verbose then Report.Comment("Case 19"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_01, Rem_0_001);
         if Quot_0_01 /= DT_0_01(0.06) or Rem_0_001 /= DT_0_001(0.001) then
            Report.Failed("Incorrect values returned, Case 19");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_01, DT_0_01);
      begin
         if TC_Verbose then Report.Comment("Case 20"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_01, Rem_0_01);
         if Quot_0_01 /= DT_0_01(0.06) or Rem_0_01 /= DT_0_01(0.0) then
            Report.Failed("Incorrect values returned, Case 20");
         end if;
      end;


   exception
      when others => Report.Failed("Exception raised in Radix_10_Block");
   end Radix_10_Block;



   Radix_2_Block:
   declare

      -- Declare all types and variables used in the various blocks below
      -- for all Radix 2 evaluations.

      type DT_1       is delta 1.0     digits 5; 
      type DT_0_1     is delta 0.1     digits 10; 
      type DT_0_01    is delta 0.01    digits 10; 
      type DT_0_001   is delta 0.001   digits 10; 
      type DT_0_0001  is delta 0.0001  digits 10; 
      type DT_0_00001 is delta 0.00001 digits 10; 

      for DT_1'Machine_Radix       use 2;
      for DT_0_1'Machine_Radix     use 2;
      for DT_0_01'Machine_Radix    use 2;
      for DT_0_001'Machine_Radix   use 2;
      for DT_0_0001'Machine_Radix  use 2;
      for DT_0_00001'Machine_Radix use 2;

      Dd_1,       Dv_1,       Quot_1,       Rem_1       : DT_1       := 0.0;
      Dd_0_1,     Dv_0_1,     Quot_0_1,     Rem_0_1     : DT_0_1     := 0.0;
      Dd_0_01,    Dv_0_01,    Quot_0_01,    Rem_0_01    : DT_0_01    := 0.0;
      Dd_0_001,   Dv_0_001,   Quot_0_001,   Rem_0_001   : DT_0_001   := 0.0;
      Dd_0_0001,  Dv_0_0001,  Quot_0_0001,  Rem_0_0001  : DT_0_0001  := 0.0;
      Dd_0_00001, Dv_0_00001, Quot_0_00001, Rem_0_00001 : DT_0_00001 := 0.0;

   begin 


      declare
         procedure Div is 
            new Ada.Decimal.Divide(Dividend_Type  => DT_0_01,
                                   Divisor_Type   => DT_0_1,
                                   Quotient_Type  => DT_0_1,
                                   Remainder_Type => DT_0_01);
      begin
         if TC_Verbose then Report.Comment("Case 21"); end if;
         Dd_0_01 := DT_0_01(0.05);  Dv_0_1 := DT_0_1(0.3);
         Div(Dd_0_01, Dv_0_1, Quot_0_1, Rem_0_01);
         if Quot_0_1 /= DT_0_1(0.1)  or  Rem_0_01 /= DT_0_01(0.02) then
            Report.Failed("Incorrect values returned, Case 21");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_0_1, DT_0_1, DT_0_1);
      begin
         if TC_Verbose then Report.Comment("Case 22"); end if;
         Dd_0_01 := DT_0_01(0.05);   Dv_0_1 := DT_0_1(0.3);
         Div(Dd_0_01, Dv_0_1, Quot_0_1, Rem_0_1);
         if Quot_0_1 /= DT_0_1(0.1) or  Rem_0_1 /= DT_0_1(0.0) then
            Report.Failed("Incorrect values returned, Case 22");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_0_1, DT_0_01, DT_0_001);
      begin
         if TC_Verbose then Report.Comment("Case 23"); end if;
         Dd_0_01 := DT_0_01(0.05);  Dv_0_1 := DT_0_1(0.3);
         Div(Dd_0_01, Dv_0_1, Quot_0_01, Rem_0_001);
         if Quot_0_01 /= DT_0_01(0.16) or  Rem_0_001 /= DT_0_001(0.002) then
            Report.Failed("Incorrect values returned, Case 23");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_0_1, DT_0_01, DT_0_01);
      begin
         if TC_Verbose then Report.Comment("Case 24"); end if;
         Dd_0_01 := DT_0_01(0.05);  Dv_0_1 := DT_0_1(0.3);
         Div(Dd_0_01, Dv_0_1, Quot_0_01, Rem_0_01);
         if Quot_0_01 /= DT_0_01(0.16) or  Rem_0_01 /= DT_0_01(0.0) then
            Report.Failed("Incorrect values returned, Case 24");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_0_1, DT_0_001, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 25"); end if;
         Dd_0_01 := DT_0_01(0.05);  Dv_0_1 := DT_0_1(0.3);
         Div(Dd_0_01, Dv_0_1, Quot_0_001, Rem_0_0001);
         if Quot_0_001 /= DT_0_001(0.166)   or 
            Rem_0_0001 /= DT_0_0001(0.0002) 
         then
            Report.Failed("Incorrect values returned, Case 25");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_1, DT_0_01, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 26"); end if;
         Dd_0_01 := DT_0_01(0.15);  Dv_1 := DT_1(20);
         Div(Dd_0_01, Dv_1, Quot_0_01, Rem_0_0001);
         if Quot_0_01 /= DT_0_01(0.0) or Rem_0_0001 /= DT_0_0001(0.1500) then
            Report.Failed("Incorrect values returned, Case 26");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_1, DT_0_01, DT_0_001);
      begin
         if TC_Verbose then Report.Comment("Case 27"); end if;
         Dd_0_01 := DT_0_01(0.15);  Dv_1 := DT_1(20);
         Div(Dd_0_01, Dv_1, Quot_0_01, Rem_0_001);
         if Quot_0_01 /= DT_0_01(0.0) or Rem_0_001 /= DT_0_001(0.150) then
            Report.Failed("Incorrect values returned, Case 27");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_1, DT_0_01, DT_0_01);
      begin
         if TC_Verbose then Report.Comment("Case 28"); end if;
         Dd_0_01 := DT_0_01(0.15);  Dv_1 := DT_1(20);
         Div(Dd_0_01, Dv_1, Quot_0_01, Rem_0_01);
         if Quot_0_01 /= DT_0_01(0.0) or Rem_0_01 /= DT_0_01(0.15) then
            Report.Failed("Incorrect values returned, Case 28");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_1, DT_0_001, DT_0_001);
      begin
         if TC_Verbose then Report.Comment("Case 29"); end if;
         Dd_0_01 := DT_0_01(0.15);  Dv_1 := DT_1(20);
         Div(Dd_0_01, Dv_1, Quot_0_001, Rem_0_001);
         if Quot_0_001 /= DT_0_001(0.007) or  Rem_0_001 /= DT_0_001(0.01) then
            Report.Failed("Incorrect values returned, Case 29");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_1, DT_0_001, DT_0_01);
      begin
         if TC_Verbose then Report.Comment("Case 30"); end if;
         Dd_0_01 := DT_0_01(0.15);  Dv_1 := DT_1(20);
         Div(Dd_0_01, Dv_1, Quot_0_001, Rem_0_01);
         if Quot_0_001 /= DT_0_001(0.007) or  Rem_0_01 /= DT_0_01(0.01) then
            Report.Failed("Incorrect values returned, Case 30");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_01, DT_1, DT_0_0001, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 31"); end if;
         Dd_0_01 := DT_0_01(0.15);  Dv_1 := DT_1(20);
         Div(Dd_0_01, Dv_1, Quot_0_0001, Rem_0_0001);
         if Quot_0_0001 /= DT_0_0001(0.0075) or 
            Rem_0_0001  /= DT_0_0001(0.0) 
         then
            Report.Failed("Incorrect values returned, Case 31");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_0001, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 32"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_0001, Rem_0_0001);
         if Quot_0_0001 /= DT_0_0001(0.0625) or 
            Rem_0_0001  /= DT_0_0001(0.0) 
         then
            Report.Failed("Incorrect values returned, Case 32");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_001, DT_0_00001);
      begin
         if TC_Verbose then Report.Comment("Case 33"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_001, Rem_0_00001);
         if Quot_0_001 /= DT_0_001(0.062) or 
            Rem_0_00001  /= DT_0_00001(0.00025)
         then
            Report.Failed("Incorrect values returned, Case 33");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_001, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 34"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_001, Rem_0_0001);
         if Quot_0_001 /= DT_0_001(0.062) or 
            Rem_0_0001  /= DT_0_0001(0.0002)
         then
            Report.Failed("Incorrect values returned, Case 34");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_001, DT_0_001);
      begin
         if TC_Verbose then Report.Comment("Case 35"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_001, Rem_0_001);
         if Quot_0_001 /= DT_0_001(0.062) or Rem_0_001 /= DT_0_001(0.000)
         then
            Report.Failed("Incorrect values returned, Case 35");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_001, DT_0_01);
      begin
         if TC_Verbose then Report.Comment("Case 36"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_001, Rem_0_01);
         if Quot_0_001 /= DT_0_001(0.062) or Rem_0_01 /= DT_0_01(0.00) then
            Report.Failed("Incorrect values returned, Case 36");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_01, DT_0_00001);
      begin
         if TC_Verbose then Report.Comment("Case 37"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_01, Rem_0_00001);
         if Quot_0_01 /= DT_0_01(0.06) or Rem_0_00001 /= DT_0_00001(0.00125) 
         then
            Report.Failed("Incorrect values returned, Case 37");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_01, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 38"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_01, Rem_0_0001);
         if Quot_0_01 /= DT_0_01(0.06) or Rem_0_0001 /= DT_0_0001(0.0012) 
         then
            Report.Failed("Incorrect values returned, Case 38");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_01, DT_0_001);
      begin
         if TC_Verbose then Report.Comment("Case 39"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_01, Rem_0_001);
         if Quot_0_01 /= DT_0_01(0.06) or Rem_0_001 /= DT_0_001(0.001) then
            Report.Failed("Incorrect values returned, Case 39");
         end if;
      end;


      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_00001, DT_0_1, DT_0_01, DT_0_01);
      begin
         if TC_Verbose then Report.Comment("Case 40"); end if;
         Dd_0_00001 := DT_0_00001(0.03125);  Dv_0_1 := DT_0_1(0.5);
         Div(Dd_0_00001, Dv_0_1, Quot_0_01, Rem_0_01);
         if Quot_0_01 /= DT_0_01(0.06) or Rem_0_01 /= DT_0_01(0.0) then
            Report.Failed("Incorrect values returned, Case 40");
         end if;
      end;

      declare
         procedure Div is 
            new Ada.Decimal.Divide(DT_0_0001, DT_1, DT_0_0001, DT_0_0001);
      begin
         if TC_Verbose then Report.Comment("Case 41"); end if;
         Dd_0_0001 := (DT_0_0001(6062.0) / DT_0_0001(16384.0));  
         Dv_1 := DT_1(0.0);
         Div(Dd_0_0001, Dv_1, Quot_0_0001, Rem_0_0001);
         Report.Failed("Divide by Zero didn't raise Constraint_Error, " &
                       "Case 41");
      exception
         when Constraint_Error =>  null;  -- OK, expected exception.
         when others => 
            Report.Failed("Unexpected exception raised by Divide by Zero," &
                          "Case 41");
      end;

   exception
      when others => Report.Failed("Exception raised in Radix_10_Block");
   end Radix_2_Block;


   Report.Result;

end CXF2001;
