home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* *)
- (* Amiga Oberon Library Module: RealConversions Date: 02-Nov-92 *)
- (* *)
- (* © 1991 by Fridtjof Siebert *)
- (* *)
- (*-------------------------------------------------------------------------*)
-
- MODULE RealConversions;
-
- IMPORT trans := MathTrans,
- math := MathFFP;
-
- PROCEDURE StringToReal*(VAR str: ARRAY OF CHAR;
- VAR r: REAL): BOOLEAN;
-
- (*
- Parst den String nach folgender Grammatik:
-
- digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9".
- sign = ["+"|"-"].
- int = {digit}.
- real = sign int ["." int] [("E"|"e") sign int].
-
- Der String darf Leerzeichen enthalten. Sie werden ignoriert.
-
- Das Ergebnis ist TRUE, wenn der String eine korrekte Zahl enthielt.
- *)
-
- VAR
- ch: CHAR;
- c: INTEGER;
- s: BOOLEAN;
- i: REAL;
- n: INTEGER;
-
- PROCEDURE Next();
- BEGIN
- REPEAT
- INC(c);
- IF c=LEN(str) THEN ch := 0X
- ELSE ch := str[c] END;
- UNTIL ch#" ";
- END Next;
-
- PROCEDURE Int(): REAL;
- VAR i: REAL;
- BEGIN
- i := 0; n := 0;
- LOOP
- CASE ch OF
- "0".."9": i := 10*i + (ORD(ch) - ORD("0")) |
- ELSE EXIT END;
- Next;
- INC(n);
- END;
- RETURN i;
- END Int;
-
- PROCEDURE Sign(): BOOLEAN;
- BEGIN
- CASE ch OF "-": Next; RETURN TRUE |
- "+": Next |
- ELSE END;
- RETURN FALSE
- END Sign;
-
- BEGIN
- r := 0;
- c := -1; Next;
- s := Sign();
- i := Int();
- r := i;
- IF ch="." THEN Next; r := r + Int() / trans.Pow(n,10) END;
- IF s THEN r := - r END;
- IF CAP(ch)="E" THEN
- Next; s := Sign(); i := Int();
- IF s THEN i := - i END;
- r := r * trans.Pow(i,10);
- END;
- RETURN ch=0X;
- END StringToReal;
-
-
- PROCEDURE RealToString*( r: REAL;
- VAR str: ARRAY OF CHAR;
- v,n: INTEGER;
- exp: BOOLEAN): BOOLEAN;
-
- (*
- Wandelt r in einen String. Dabei hat das Ergebnis v Vorkommastellen und n
- Nachkommastellen. Ist exp=TRUE, dann wird auch ein Exponent erzeugt. str
- muß ohne Exponent mindestens n+v+3 und mit Exponent mindestens n+v+7
- Zeichen lang sein. Das Ergebnis ist TRUE, wenn die Zahl in die vorgegebene
- Schablone paßt.
-
- Beispiel:
-
- RealToString(123.456,str,1,7,TRUE) wandelt 123.456 in die
- wissenschaftliche Darstellng um. Das Ergebnis ist "1.23456700E+02".
-
- *)
-
- VAR
- c: INTEGER;
- e: LONGINT;
- res: BOOLEAN;
-
- PROCEDURE Int(i: REAL; n: INTEGER);
- VAR d: LONGINT;
- m: INTEGER;
- j: REAL;
- BEGIN
- INC(c,n); m := 0;
- WHILE m<n DO
- INC(m); j := i/10;
- d := ENTIER(i-10*math.Floor(j));
- CASE d OF 0..9: ELSE d := 0 END;
- str[c-m] := CHR(d+ORD("0"));
- i := j;
- END;
- IF i>=1 THEN res := FALSE END;
- END Int;
-
- BEGIN
- c := 0; e := 0; res := TRUE;
- IF r<0 THEN str[c] := "-"; r := -r;
- ELSE str[c] := " " END;
- INC(c);
- IF exp THEN
- IF r=0 THEN e := 0 ELSE
- e := ENTIER(math.Floor(trans.Log10(r)));
- IF (e>0) & (e<v) THEN e := 0 END;
- END;
- r := trans.Pow(-e,10) * r;
- END;
- r := r + trans.Pow(n,0.1)/2;
- Int(r,v);
- IF n>0 THEN
- str[c] := ".";
- INC(c);
- Int(trans.Pow(n,10) * (r-math.Floor(r)),n);
- END;
- IF exp THEN
- IF e#0 THEN
- str[c] := "E"; INC(c);
- IF e<0 THEN str[c] := "-"; e := -e;
- ELSE str[c] := "+" END;
- INC(c); Int(e,2);
- ELSE
- n := 4;
- REPEAT str[c] := " "; INC(c); DEC(n) UNTIL n=0;
- END;
- END;
- n := 1;
- WHILE (n<v) & (str[n]="0") DO str[n] := " "; INC(n) END;
- str[c] := 0X;
- RETURN res;
- END RealToString;
-
-
- END RealConversions.
-
-