home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
jËzyki_programowania
/
oberon
/
nonfpu
/
reals.mod
(
.txt
)
< prev
next >
Wrap
Oberon Text
|
1977-12-31
|
3KB
|
94 lines
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.