NUMAL Section 1.5.3

BEGIN SECTION : 1.5.3 (March, 1977)

AUTHORS: T.J.DEKKER & J.KOOPMAN.

CONTRIBUTOR: J.KOOPMAN.

INSTITUTE: UNIVERSITY OF AMSTERDAM.

RECIEVED: 770328

BRIEF DESCRIPTION:

    LNGREATODECI CONVERTS A DOUBLE-LENGTH NUMBER TO A
    NUMBER IN DECIMAL FLOATING-POINT REPRESENTATION.
    THE RESULT CONSISTS OF A MANTISSA MANT OF MAGNITUDE<1
    (AND >=.1) AND A DECIMAL EXPONENT EXPO.

KEYWORDS:

    DOUBLE PRECISION ARITHMETIC,
    CONVERSION,
    DECIMAL REPRESENTATION.

CALLING SEQUENCE:

    THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:

    "PROCEDURE" LNGREATODECI(X, XX, S, MANT, EXPO);
    "VALUE"X,XX,S;"INTEGER"S,EXPO;"REAL"X,XX;"INTEGER""ARRAY"MANT;
    "CODE" 31100;

    THE MEANING OF THE FORMAL PARAMETERS IS:
    X,XX   : <ARITHMETIC EXPRESSIONS>;
             ENTRY: THE HEAD (X) AND TAIL (XX) OF THE NUMBER
                    THAT IS TO BE CONVERTED;
    S      : <ARITHMETIC EXPRESSION>;
             ENTRY: THE DESIRED NUMBER OF SIGNIFICANT DIGITS
                    OF THE CONVERTED VARIABLE.
                    ONE SHOULD NOT CHOOSE S LARGER THAN THE NUMBER
                    OF DIGITS CORRESPONDING TO THE DOUBLE LENGTH
                    MACHINE PRECISION (FOR CDC: S<29 ). OTHERWISE,
                    THE LAST DIGITS ARE USELESS, AS ALL OPERATIONS
                    IN LNGREATODECI ARE PERFORMED IN DOUBLE-LENGTH A-
                    RITHMETIC; IF S IS CHOSEN NONPOSITIVE,ONLY THE SIGN
                    AND THE DECIMAL EXPONENT OF THE CONVERTED NUMBER
                    ARE DELIVERED;

    MANT   : <ARRAY IDENTIFIER>;
             "INTEGER""ARRAY"MANT[0:S];
             EXIT: MANT[0]: THE SIGN OF THE DECIMAL NUMBER;
                   MANT[I] (I^=0): THE I-TH  SIGNIFICANT
                   DIGIT OF THE MANTISSA OF THE CONVERTED NUMBER;
                   I.E. THE VALUE OF THE MANTISSA EQUALS
                   MANT[0]*(MANT[1]/10+MANT[2]/100+...MANT[S]/10**S);
    EXPO   : <INTEGER VARIABLE>;
             EXIT: THE DECIMAL EXPONENT OF THE CONVERTED NUMBER,
                   I.E. THE DOUBLE-LENGTH NUMBER (X,XX) APPROXIMATELY
                   EQUALS MANTISSA*10**EXPO WITH THE VALUE OF
                   MANTISSA GIVEN IN MANT.

PROCEDURES USED:

    LNG SUB = CP31106.
    LNG MUL = CP31108.
    DP POW  = CP31109.

RUNNING TIME:

    ROUGHLY PROPORTIONAL TO LN(LN(X))+S.

LANGUAGE: ALGOL 60.

METHOD AND PERFORMANCE:

    LNGREATODECI DETERMINES THE DECIMAL EXPONENT EXPO. AFTER
    THAT, THE LONG REAL NUMBER (X,XX) IS DIVIDED BY 10**EXPO
    IN DOUBLE PRECISION. BY TRUNCATING THE RESULT, THE
    FIRST MOST SIGNIFICANT DIGIT OF THE MANTISSA IS OB-
    TAINED. SUBTRACTING THIS DIGIT FROM (X,XX)/10**EXPO,
    MULTIPLYING THE RESULT WITH 10, THE NEXT MOST SIGNI-
    FICANT DIGIT CAN BE OBTAINED BY TRUNCATION. THIS PRO-
    CESS OF SUBTRACTION, MULTIPLICATION AND TRUNCATION WILL
    BE REPEATED UNTIL S DIGITS ARE OBTAINED. FINALLY,
    THE MANTISSA THUS OBTAINED IS PROPERLY ROUNDED.

EXAMPLE OF USE:

"BEGIN""COMMENT"EXAMPLE OF USE OF LNGREATODECI AND DP POW;
       "INTEGER"S,EXPO;
       "REAL"OP,OPL;

       "PROCEDURE"PRINT(S,MANT,EXPONENT);
       "VALUE"S,EXPONENT;"INTEGER"S,EXPONENT;"INTEGER""ARRAY"MANT;
       "BEGIN""INTEGER"K;
              OUTCHARACTER(61,"("-++")",MANT[0]+2);
              "FOR"K:=1"STEP"1"UNTIL"S"DO"
              "BEGIN""IF"K=1"THEN"OUTPUT(61,"(""(".")"")");
                     OUTPUT(61,"("D")",MANT[K])
              "END";OUTPUT(61,"(""(""")",+3D")",EXPONENT)
       "END"PRINT;

       DP POW(2,48,OP,OPL);
       "FOR"S:=0"STEP"4 "UNTIL"28"DO"
       "BEGIN""INTEGER""ARRAY"MANT[0:S];
              LNGREATODECI(OP,OPL,S,MANT,EXPO);
              PRINT(S,MANT,EXPO);
              OUTPUT(61,"("/")")
       "END"
"END"

DELIVERS:

+"+015
+.2815"+015
+.28147498"+015
+.281474976711"+015
+.2814749767106560"+015
+.28147497671065600000"+015
+.281474976710656000000000"+015
+.2814749767106560000000000000"+015

SOURCE TEXT(S):

"CODE" 31100;