home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
jËzyki_programowania
/
oberon
/
system
/
reals.mod
(
.txt
)
< prev
next >
Wrap
Oberon Text
|
1977-12-31
|
3KB
|
100 lines
Syntax10.Scn.Fnt
Syntax10b.Scn.Fnt
MODULE Reals; (** JT, RC, Bernd Moesli, cn, JR; 26-May-96 RD *)
IMPORT HostSYS, S:=SYSTEM;
H: LONGINT;
PROCEDURE Expo* (x: REAL): INTEGER;
BEGIN
RETURN SHORT(ASH(S.VAL(LONGINT, x), -23) MOD 256)
END Expo;
PROCEDURE ExpoL* (x: LONGREAL): INTEGER;
VAR i: LONGINT;
BEGIN
S.GET(S.ADR(x) + H, i); RETURN SHORT(ASH(i, -20) MOD 2048)
END ExpoL;
PROCEDURE SetExpo*(e: INTEGER; VAR x: REAL);
CONST expo = {23..30};
BEGIN
x := S.VAL(REAL, S.VAL(SET, x) - expo + S.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
S.GET(S.ADR(x)+H, h);
h := h - expo + S.VAL(SET, ASH(LONG(e), 20));
S.PUT(S.ADR(x)+H, h)
END SetExpoL;
PROCEDURE Ten*(e: INTEGER): REAL;
VAR r, power: LONGREAL;
BEGIN
r := 1.0;
power := 10.0;
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.0;
power := 10.0;
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 Convert*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR);
VAR i: LONGINT; k: INTEGER;
BEGIN
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);
VAR i, k, q: INTEGER;
BEGIN
k:=0;
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(ENTIER(x));
d[i]:=CHR(48+q);
x:=(x-q)*10.0
END ConvertL;
PROCEDURE Unpack(VAR b, d: ARRAY OF S.BYTE);
VAR i, len: LONGINT; k: SHORTINT;
BEGIN
i := 0; len := LEN(b);
IF HostSYS.BigEndianMachine THEN (* big endian *)
WHILE i < len DO
k := SHORT(ORD(S.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(S.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
ELSE (* little endian *)
WHILE i < len DO
k := SHORT(ORD(S.VAL(CHAR, b[len - i - 1])) DIV 16);
IF k > 9 THEN d[i*2] := k + 55 ELSE d[i*2] := k + 48 END;
k := SHORT(ORD(S.VAL(CHAR, b[len - i - 1])) MOD 16);
IF k > 9 THEN d[i*2+1] := k + 55 ELSE d[i*2+1] := k + 48 END;
INC(i)
END
END Unpack;
PROCEDURE ConvertH*(y: REAL; VAR d: ARRAY OF CHAR);
TYPE Array4 = ARRAY 4 OF CHAR; (* to avoid warning 1 *)
BEGIN Unpack(S.VAL(Array4, y), d)
END ConvertH;
PROCEDURE ConvertHL*(x: LONGREAL; VAR d: ARRAY OF CHAR);
TYPE Array8 = ARRAY 8 OF CHAR; (* to avoid warning 1 *)
BEGIN Unpack(S.VAL(Array8, x), d)
END ConvertHL;
BEGIN
IF HostSYS.BigEndianMachine THEN H:=0 ELSE H:=4 END
END Reals.