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;