NUMAL Section 6.2

BEGIN SECTION : 6.2 (January, 1979)

AUTHOR: D.T.WINTER.

INSTITUTE: MATHEMATICAL CENTRE,AMSTERDAM.

RECEIVED: 751208.

BRIEF DESCRIPTION:

    THIS SECTION CONTAINS SEVEN PROCEDURES:
    A)  MBASE: DELIVERS THE BASE OF THE ARITHMETIC OF THE COMPUTER;
    B)  ARREB: DELIVERS THE ARITHMETIC ERROR BOUND OF THE COMPUTER;
    C)  DWARF: DELIVERS THE SMALLEST  (IN ABSOLUTE VALUE) REPRESENTABLE
            REAL NUMBER;
    D)  GIANT: DELIVERS THE LARGEST REPRESENTABLE REAL NUMBER;
    E)  INTCAP: DELIVERS THE INTEGER CAPACITY;
    F)  OVERFLOW: TESTS WHETHER A VALUE IS AN OVERFLOW VALUE;
    G)  UNDERFLOW: TESTS WHETHER A VALUE IS AN UNDERFLOW VALUE;
    FOR A DETAILED DESCRIPTION SEE METHOD AND PERFORMANCE.

KEYWORDS:

    ARITHMETIC CONSTANTS
    MACHINE CONSTANTS
    OVERFLOW
    UNDERFLOW


SUBSECTION: MBASE

CALLING SEQUENCE:

    THE HEADING OF THE PROCEDURE IS:
    "INTEGER" "PROCEDURE" MBASE;
    "CODE" 30001;

    MBASE:= 2, THE BASE OF THE ARITHMETIC OF THE CYBER.

LANGUAGE: COMPASS


SUBSECTION: ARREB

CALLING SEQUENCE:

    THE HEADING OF THE PROCEDURE IS:
    "REAL" "PROCEDURE" ARREB;
    "CODE" 30002;

    ARREB:= 2 ** (-47), THE ARITHMETIC RELATIVE ERROR BOUND.

LANGUAGE: COMPASS


SUBSECTION: DWARF

CALLING SEQUENCE:

    THE HEADING OF THE PROCEDURE IS:
    "REAL" "PROCEDURE" DWARF;
    "CODE" 30003;

    DWARF:= THE SMALLEST (IN ABSOLUTE VALUE) REPRESENTABLE REAL NUMBER.

LANGUAGE: COMPASS


SUBSECTION: GIANT

CALLING SEQUENCE:

    THE HEADING OF THE PROCEDURE IS:
    "REAL" "PROCEDURE" GIANT;
    "CODE" 30004;

    GIANT:= THE LARGEST REPRESENTABLE REAL NUMBER.

LANGUAGE: COMPASS


SUBSECTION: INTCAP

CALLING SEQUENCE:

    THE HEADING OF THE PROCEDURE IS:
    "INTEGER" "PROCEDURE" INTCAP;
    "CODE" 30005;

    INTCAP:= THE INTEGER CAPACITY.

LANGUAGE: COMPASS


SUBSECTION: OVERFLOW

CALLING SEQUENCE:

    THE HEADING OF THE PROCEDURE IS:
    "BOOLEAN" "PROCEDURE" OVERFLOW(X); "VALUE" X; "REAL" X;
    "CODE" 30008;

    THE MEANING OF THE FORMAL PARAMETER IS:
    X:  <REAL VARIABLE>;
        CONTAINS THE VALUE TO BE TESTED.

    OVERFLOW  DELIVERS  "TRUE"  IF  X  CONTAINS AN OVERFLOW VALUE,  AND
    "FALSE" OTHERWISE.

LANGUAGE: COMPASS


SUBSECTION: UNDERFLOW

CALLING SEQUENCE:

    THE HEADING OF THE PROCEDURE IS:
    "BOOLEAN" "PROCEDURE" UNDERFLOW(X); "VALUE" X; "REAL" X;
    "CODE" 30009;

    THE MEANING OF THE FORMAL PARAMETER IS:
    X:  <REAL VARIABLE>;
        CONTAINS THE VALUE TO BE TESTED.

    UNDERFLOW DELIVERS  "TRUE"  IF  X CONTAINS AN UNDERFLOW VALUE,  AND
    "FALSE" OTHERWISE.

LANGUAGE: COMPASS

METHOD AND PERFORMANCE:

    THE PROCEDURES DELIVER  THE FOLLOWING VALUES,  THAT ARE ESSENTIALLY
    MACHINE DEPENDENT:
    1)  MBASE: 2;
    2)  ARREB: 2**(-47);
    3)  DWARF: 2**48*2**(-1022);
    4)  GIANT: (2**48-1)*2**1022;
    5)  INTCAP: 2**48-2.
    FOR MBASE,  DWARF AND  GIANT THE VALUES  ARE CLEAR,  WE EXPLAIN THE
    OTHERS HERE:
    ARREB: THIS IS THE SMALLEST POSITIVE NUMBER SO THAT 1+ARREB^=1;
    INTCAP: THIS IS  THE LARGEST POSITIVE NUMBER  SO THAT THE FOLLOWING
        BOOLEAN EXPRESSION DELIVERS "TRUE" FOR EVERY INTEGER I:
            "IF" I<0 "OR" I>INTCAP "THEN" "TRUE" "ELSE" I-1^=I;
        THE CORRECT VALUE IS NOT  2**48-1,  AS IN THE  CYBER ARITHMETIC
        I=J IF I=2**48 AND J=2**48-1.
    WARNING: DWARF IS NOT VERY USEFUL WHEN TRAPPING UNDERFLOW VALUES:
        ABS(X) >= DWARF  NEARLY ALWAYS  DELIVERS TRUE EVEN IF ABS(X) IS
        SMALLER  THEN  DWARF  DUE  TO THE ARITHMETIC.  ONE  SHOULD USE:
        ABS(X) > DWARF  (AND  ONE  TRAPS  NON-UNDERFLOW VALUES TOO)  OR
        THE PROCEDURE UNDERFLOW.
    NOTE: AS THE ALGOL 60 ERRORMESSAGE "ARITHMETIC OVERFLOW"
        IS NOT ISSUED AT THE MOMENT THE OVERFLOW VALUE
        IS CREATED BUT WHEN SUCH A VALUE IS USED, THE
        PROCEDURE OVERFLOW IS WELL-DEFINED.

EXAMPLE OF USE:

    HERE WE GIVE  AN EXAMPLE  OF USE  OF THE  PROCEDURES  OVERFLOW  AND
    UNDERFLOW:

    "BEGIN"
        "REAL" X, Y;
        Y:= 0; X:= 1 / Y;
        "IF" OVERFLOW(X) "THEN" OUTPUT(61, "(""("OVERFLOW")", /")");
        X:= DWARF; Y:= 2.0;
        "IF" "NOT" UNDERFLOW(X) "THEN"
        OUTPUT(61, "(""("NO UNDERFLOW WITH DWARF")", /")");
        X:= X / Y;
        "IF" X ^= 0 "THEN"
        OUTPUT(61, "(""("DWARF / 2 ^= 0")", /")");
        "IF" UNDERFLOW(X) "THEN"
        OUTPUT(61, "(""("DWARF / 2 IS UNDERFLOW")", /")");
        "IF" X * Y = 0 "THEN"
        OUTPUT(61, "(""("BECAUSE (DWARF / 2) * 2 = 0")", /")")
    "END"

    RESULTS:
    OVERFLOW
    NO UNDERFLOW WITH DWARF
    DWARF / 2 ^= 0
    DWARF / 2 IS UNDERFLOW
    BECAUSE (DWARF / 2) * 2 = 0

SOURCE TEXTS:

    THESE  ARE NOT  THE ACTUAL  SOURCE TEXTS,  AS THESE  PROCEDURES ARE
    WRITTEN IN COMPASS,  MOREOVER,  THE RESULTS NEED NOT BE THAT OF THE
    ACTUAL PROCEDURES.

    THE SOURCE TEXTS OF OVERFLOW AND UNDERFLOW  ARE NOT GIVEN HERE,  AS
    THESE EVEN CANNOT BE SIMULATED IN ALGOL-60.

"CODE" 30001;

"CODE" 30002;

"CODE" 30003;

"CODE" 30004;

"CODE" 30005;