NUMAL Section 1.5.1

BEGIN SECTION : 1.5.1 (March, 1977)

AUTHORS: D.T.WINTER(A-D,F-I), T.J.DEKKER(E,J)

CONTRIBUTOR: J.KOOPMAN(E,J)

INSTITUTES: MATHEMATICAL CENTRE,UNIVERSITY OF AMSTERDAM.

RECEIVED: 770328

BRIEF DESCRIPTION:

    THIS SECTION CONTAINS  PROCEDURES FOR THE  ELEMENTARY OPERATIONS IN
    DOUBLE PRECISION ARITHMETIC.

    A. DPADD  ADDS TWO SINGLE PRECISION NUMBERS TO A DOUBLE PRECISION
              SUM.
    B. DPSUB  SUBTRACTS TWO SINGLE PRECISION NUMBERS TO A DOUBLE
              PRECISION DIFFERENCE.
    C. DPMUL  MULTIPLIES   TWO  SINGLE  PRECISION  NUMBERS   TO  A
              DOUBLE PRECISION PRODUCT.
    D. DPDIV  DIVIDES  TWO SINGLE PRECISION NUMBERS  TO A DOUBLE
              PRECISION QUOTIENT.
    E. DPPOW  COMPUTES A**EXPON IN DOUBLE PRECISION,WHERE
              A IS A SINGLE PRECISION REAL NUMBER AND EXPON THE
              INTEGER EXPONENT.
    F. LNGADD ADDS TWO DOUBLE PRECISION NUMBERS.
    G. LNGSUB SUBTRACTS TWO DOUBLE PRECISION NUMBERS.
    H. LNGMUL MULTIPLIES TWO DOUBLE PRECISION NUMBERS.
    I. LNGDIV DIVIDES TWO DOUBLE PRECISION NUMBERS.
    J. LNGPOW COMPUTES (A,AA)**EXPON IN DOUBLE PRECISION,WHERE
              (A,AA) IS A DOUBLE PRECISION REAL NUMBER AND EXPON
              THE INTEGER EXPONENT.

KEYWORDS:

    DOUBLE PRECISION ARITHMETIC
    EXPONENTIATION.

LANGUAGE: COMPASS(A-D,F-I),ALGOL 60(E,J)

METHOD AND PERFORMANCE:

    THE PROCEDURES A-D,F-I USE THE HARDWARE FUNCTIONS FOR DOUBLE
    PRECISION THAT ARE AVAILIBLE ON THE CYBER.
    THE PROCEDURES  LNG ADD,  LNG SUB,  LNG MUL AND  LNG DIV  CHECK THE
    INPUT PARAMETERS  (A,AA)  AND  (B,BB)  FOR CORRECTNESS. A HEAD/TAIL
    PAIR IS  A CORRECT  DOUBLE  PRECISION  PARAMETER  IN THE  FOLLOWING
    CASES:
    A)  THE TAIL IS ZERO;
    B)  THE EXPONENT  IN THE BINARY  REPRESENTATION  OF THE TAIL  IS 48
        LESS THAN THE EXPONENT OF THE HEAD.
    AN OUTPUT PARAMETER  OF THESE PROCEDURES ALWAYS IS A CORRECT DOUBLE
    PRECISION NUMBER.  IF AN INPUT PARAMETER IS NOT CORRECT,  THE ERROR
    MESSAGE "DP PARAMETER TAIL ERROR" WILL BE ISSUED.

    BOTH PROCEDURES E AND J MAKE USE OF THE BINARY REPRESENTATION OF
    THE INTEGER EXPONENT. IF X DENOTES THE NUMBER THAT IS TO BE
    EXPONENTIATED, THE PROCEDURES E AND J RUN AS FOLLOWS:
    THE SEQUENCE X,X**2,X**4,X**8,... IS FORMED WHILE
    SIMULTANEOUSLY THE BINARY REPRESENTATION OF THE EXPONENT
    IS CHECKED; WHEN THE I-TH DIGIT EQUALS ONE,THE FACTOR
    X**(2**(I-1)) IS TAKEN INTO ACCOUNT.

EXAMPLE OF USE:

    SEE THE PROCEDURE LNGREATODECI (SECTION 1.5.3).


SUBSECTION: DP ADD

CALLING SEQUENCE:

    THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
    "PROCEDURE" DP ADD(A, B, C, CC);
    "VALUE" A, B; "REAL" A, B, C, CC;
    "CODE" 31101;

    THE MEANING OF THE FORMAL PARAMETERS IS:
    A,B: <ARITHMETIC EXPRESSIONS>;
        THE OPERANDS;
    C,CC: <REAL VARIABLES>;
        THE HEAD AND TAIL OF THE DOUBLE PRECISION RESULT OF A+B.


SUBSECTION: DP SUB

CALLING SEQUENCE:

    THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
    "PROCEDURE" DP SUB(A, B, C, CC);
    "VALUE" A, B; "REAL" A, B, C, CC;
    "CODE" 31102;

    THE MEANING OF THE FORMAL PARAMETERS IS:
    A,B: <ARITHMETIC EXPRESSIONS>;
        THE OPERANDS;
    C,CC: <REAL VARIABLES>;
        THE HEAD AND TAIL OF THE DOUBLE PRECISION RESULT OF A-B.


SUBSECTION: DP MUL

CALLING SEQUENCE:

    THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
    "PROCEDURE" DP MUL(A, B, C, CC);
    "VALUE" A, B; "REAL" A, B, C, CC;
    "CODE" 31103;

    THE MEANING OF THE FORMAL PARAMETERS IS:
    A,B: <ARITHMETIC EXPRESSIONS>;
        THE OPERANDS;
    C,CC: <REAL VARIABLES>;
        THE HEAD AND TAIL OF THE DOUBLE PRECISION RESULT OF A*B.


SUBSECTION: DP DIV

CALLING SEQUENCE:

    THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
    "PROCEDURE" DP DIV(A, B, C, CC);
    "VALUE" A, B; "REAL" A, B, C, CC;
    "CODE" 31104;

    THE MEANING OF THE FORMAL PARAMETERS IS:
    A,B: <ARITHMETIC EXPRESSIONS>;
        THE OPERANDS;
    C,CC: <REAL VARIABLES>;
        THE HEAD AND TAIL OF THE DOUBLE PRECISION RESULT OF A/B.


SUBSECTION: DP POW.

CALLING SEQUENCE:

    THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
    "PROCEDURE"DP POW(A ,EXPON ,C ,CC );
    "VALUE"A,EXPON;"INTEGER"EXPON;"REAL"A,C,CC;
    "CODE"31109;

    THE MEANING OF THE FORMAL PARAMETERS IS:
    A       : <ARITHMETIC EXPRESSION>;
              THE NUMBER THAT IS TO BE EXPONENTIATED;
    EXPON   : <ARITHMETIC EXPRESSION>;
              THE (INTEGER) POWER TO WHICH A WILL BE RAISED;
    C , CC  : <REAL VARIABLES>;
              EXIT: THE HEAD (C) AND TAIL (CC) OF THE DOUBLE
                    PRECISION RESULT A**EXPON.

PROCEDURES USED:

    LNG POW = CP31110.

RUNNING TIME:

    ROUGHLY PROPORTIONAL TO LN(EXPON).


SUBSECTION: LNG ADD

CALLING SEQUENCE:

    THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
    "PROCEDURE" LNG ADD(A, AA, B, BB, C, CC);
    "VALUE" A, AA, B, BB; "REAL" A, AA, B, BB, C, CC;
    "CODE" 31105;

    THE MEANING OF THE FORMAL PARAMETERS IS:
    A,AA,B,BB: <ARITHMETIC EXPRESSIONS>;
        THE HEADS (A AND B) AND THE TAILS (AA AND BB) OF THE OPERANDS;
    C,CC: <REAL VARIABLES>;
        THE HEAD AND TAIL OF THE RESULT (A,AA)+(B,BB).


SUBSECTION: LNG SUB

CALLING SEQUENCE:

    THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
    "PROCEDURE" LNG SUB(A, AA, B, BB, C, CC);
    "VALUE" A, AA, B, BB; "REAL" A, AA, B, BB, C, CC;
    "CODE" 31106;

    THE MEANING OF THE FORMAL PARAMETERS IS:
    A,AA,B,BB: <ARITHMETIC EXPRESSIONS>;
        THE HEADS (A AND B) AND THE TAILS (AA AND BB) OF THE OPERANDS;
    C,CC: <REAL VARIABLES>;
        THE HEAD AND TAIL OF THE RESULT (A,AA)-(B,BB).


SUBSECTION: LNG MUL

CALLING SEQUENCE:

    THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
    "PROCEDURE" LNG MUL(A, AA, B, BB, C, CC);
    "VALUE" A, AA, B, BB; "REAL" A, AA, B, BB, C, CC;
    "CODE" 31107;

    THE MEANING OF THE FORMAL PARAMETERS IS:
    A,AA,B,BB: <ARITHMETIC EXPRESSIONS>;
        THE HEADS (A AND B) AND THE TAILS (AA AND BB) OF THE OPERANDS;
    C,CC: <REAL VARIABLES>;
        THE HEAD AND TAIL OF THE RESULT (A,AA)*(B,BB).


SUBSECTION: LNG DIV

CALLING SEQUENCE:

    THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
    "PROCEDURE" LNG DIV(A, AA, B, BB, C, CC);
    "VALUE" A, AA, B, BB; "REAL" A, AA, B, BB, C, CC;
    "CODE" 31108;

    THE MEANING OF THE FORMAL PARAMETERS IS:
    A,AA,B,BB: <ARITHMETIC EXPRESSIONS>;
        THE HEADS (A AND B) AND THE TAILS (AA AND BB) OF THE OPERANDS;
    C,CC: <REAL VARIABLES>;
        THE HEAD AND TAIL OF THE RESULT (A,AA)/(B,BB).


SUBSECTION: LNG POW.

CALLING SEQUENCE:

    THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
    "PROCEDURE"LNG POW(A ,AA ,EXPON ,C ,CC );
    "VALUE"A,AA,EXPON;"INTEGER"EXPON;"REAL"A,AA,C,CC;
    "CODE"31110;

    THE MEANING OF THE FORMAL PARAMETERS IS:
    A,AA    : <ARITHMETIC EXPRESSIONS>;
              THE HEAD (A) AND TAIL (AA) OF THE NUMBER THAT
              IS TO BE EXPONENTIATED;
    EXPON   : <ARITHMETIC EXPRESSION>;
              THE (INTEGER) POWER TO WHICH (A,AA) WILL BE RAISED;
    C,CC    : <REAL VARIABLES>;
              EXIT: THE HEAD (C) AND TAIL (CC) OF THE DOUBLE
                    PRECISION RESULT (A,AA)**EXPON.

PROCEDURES USED:

    LNG MUL = CP31107.
    LNG DIV = CP31108.

RUNNING TIME:

    ROUGHLY PROPORTIONAL TO LN(EXPON).

SOURCE TEXT(S):

ALL PROCEDURES, EXCEPT POW AND LNG POW, ARE WRITTEN IN COMPASS,  IT IS
NOT POSSIBLE TO SIMULATE THESE PROCEDURES IN ALGOL 60, SO ONLY THE TEXT
IS GIVEN FOR POW AND LNG POW.

"CODE" 31109;

"CODE" 31110;