Syntax10.Scn.Fnt ParcElems Alloc Syntax24b.Scn.Fnt Syntax10b.Scn.Fnt (* AMIGA NonFPU*) MODULE Reals; (* 11-Jun-1994/cn, use JRs routines. *) IMPORT SYSTEM, AmigaMath, AmigaMathL; PROCEDURE Ten* (e: INTEGER): REAL; VAR r, power: LONGREAL; BEGIN r := 1; power := 10; WHILE e > 0 DO IF ODD(e) THEN r := r * power END ; power := power * power; e := e DIV 2 END ; RETURN SHORT(r) END Ten; PROCEDURE TenL* (e: INTEGER): LONGREAL; VAR r, power: LONGREAL; BEGIN r := 1; power := 10; LOOP IF ODD(e) THEN r := r * power END ; e := e DIV 2; IF e <= 0 THEN RETURN r END ; power := power * power END TenL; PROCEDURE Expo* (x: REAL): INTEGER; BEGIN RETURN SHORT(ASH(SYSTEM.VAL(LONGINT, x), -23) MOD 256) END Expo; PROCEDURE ExpoL* (x: LONGREAL): INTEGER; BEGIN RETURN SHORT(ASH(SYSTEM.VAL(LONGINT, x), -20) MOD 2048) END ExpoL; PROCEDURE SetExpo*(e: INTEGER; VAR x: REAL); CONST expo = {23..30}; BEGIN SYSTEM.PUT(SYSTEM.ADR(x), SYSTEM.VAL(SET, x) - expo + SYSTEM.VAL(SET, ASH(LONG(e), 23))) END SetExpo; PROCEDURE SetExpoL*(e: INTEGER; VAR x: LONGREAL); CONST expo = {52-32..62-32}; VAR h: SET; BEGIN SYSTEM.GET(SYSTEM.ADR(x), h); h := h - expo + SYSTEM.VAL(SET, ASH(LONG(e), 20)); SYSTEM.PUT(SYSTEM.ADR(x), h) END SetExpoL; PROCEDURE Convert*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR); VAR i, k: LONGINT; BEGIN i:=AmigaMath.Entier(x); (* i := ENTIER(x); *) k := 0; WHILE k < n DO d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k) END Convert; PROCEDURE ConvertL* (x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR); i,k:INTEGER; q:INTEGER; Dum: LONGREAL; BEGIN k:=0; WHILE AmigaMathL.Cmp(x, 10.0) >= 0 DO AmigaMathL.Div(x, 10.0, x); INC(k) END; (* WHILE x>=10.0 DO x:=x/10.0; INC(k) END; *) FOR i:=n TO k+1 DO d[i]:='0'; END; FOR i:=k TO 0 BY -1 DO q:=SHORT(AmigaMathL.Entier(x)); (* q:=SHORT(ENTIER(x)); *) d[i]:=CHR(48+q); AmigaMathL.Sub(x, q, Dum); AmigaMathL.Mul(Dum, 10.0, x); (* x:=(x-q)*10.0; *) END ConvertL; PROCEDURE Unpack(VAR b, d: ARRAY OF SYSTEM.BYTE); VAR i, k: SHORTINT; BEGIN i := 0; WHILE i < LEN(b) DO k := SHORT(ORD(SYSTEM.VAL(CHAR, b[i])) DIV 16); IF k > 9 THEN d[i*2] := k + 55 ELSE d[i*2] := k + 48 END ; k := SHORT(ORD(SYSTEM.VAL(CHAR, b[i])) MOD 16); IF k > 9 THEN d[i*2+1] := k + 55 ELSE d[i*2+1] := k + 48 END ; INC(i) END Unpack; PROCEDURE ConvertH* (y: REAL; VAR d: ARRAY OF CHAR); BEGIN Unpack(y, d) END ConvertH; PROCEDURE ConvertHL* (x: LONGREAL; VAR d: ARRAY OF CHAR); BEGIN Unpack(x, d) END ConvertHL; BEGIN END Reals.