home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / OB3.2D2.DMS / in.adf / Module / RealConversions.mod < prev    next >
Encoding:
Text File  |  1994-08-05  |  3.8 KB  |  164 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*                                                                         *)
  3. (*  Amiga Oberon Library Module: RealConversions      Date: 02-Nov-92      *)
  4. (*                                                                         *)
  5. (*   © 1991 by Fridtjof Siebert                                            *)
  6. (*                                                                         *)
  7. (*-------------------------------------------------------------------------*)
  8.  
  9. MODULE RealConversions;
  10.  
  11. IMPORT trans := MathTrans,
  12.        math  := MathFFP;
  13.  
  14. PROCEDURE StringToReal*(VAR str: ARRAY OF CHAR;
  15.                         VAR r:   REAL): BOOLEAN;
  16.  
  17. (*
  18.   Parst den String nach folgender Grammatik:
  19.  
  20.     digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9".
  21.     sign  = ["+"|"-"].
  22.     int   = {digit}.
  23.     real  = sign int ["." int] [("E"|"e") sign int].
  24.  
  25.   Der String darf Leerzeichen enthalten. Sie werden ignoriert.
  26.  
  27.   Das Ergebnis ist TRUE, wenn der String eine korrekte Zahl enthielt.
  28. *)
  29.  
  30. VAR
  31.   ch: CHAR;
  32.   c: INTEGER;
  33.   s: BOOLEAN;
  34.   i: REAL;
  35.   n: INTEGER;
  36.  
  37.   PROCEDURE Next();
  38.   BEGIN
  39.     REPEAT
  40.       INC(c);
  41.       IF c=LEN(str) THEN ch := 0X
  42.                     ELSE ch := str[c] END;
  43.     UNTIL ch#" ";
  44.   END Next;
  45.  
  46.   PROCEDURE Int(): REAL;
  47.   VAR i: REAL;
  48.   BEGIN
  49.     i := 0; n := 0;
  50.     LOOP
  51.       CASE ch OF
  52.       "0".."9": i := 10*i + (ORD(ch) - ORD("0")) |
  53.       ELSE EXIT END;
  54.       Next;
  55.       INC(n);
  56.     END;
  57.     RETURN i;
  58.   END Int;
  59.  
  60.   PROCEDURE Sign(): BOOLEAN;
  61.   BEGIN
  62.     CASE ch OF "-": Next; RETURN TRUE |
  63.                "+": Next              |
  64.     ELSE END;
  65.     RETURN FALSE
  66.   END Sign;
  67.  
  68. BEGIN
  69.   r := 0;
  70.   c := -1; Next;
  71.   s := Sign();
  72.   i := Int();
  73.   r := i;
  74.   IF ch="." THEN Next; r := r + Int() / trans.Pow(n,10) END;
  75.   IF s THEN r := - r END;
  76.   IF CAP(ch)="E" THEN
  77.     Next; s := Sign(); i := Int();
  78.     IF s THEN i := - i END;
  79.     r := r * trans.Pow(i,10);
  80.   END;
  81.   RETURN ch=0X;
  82. END StringToReal;
  83.  
  84.  
  85. PROCEDURE RealToString*(    r:   REAL;
  86.                         VAR str: ARRAY OF CHAR;
  87.                             v,n: INTEGER;
  88.                             exp: BOOLEAN): BOOLEAN;
  89.  
  90. (*
  91.   Wandelt r in einen String. Dabei hat das Ergebnis v Vorkommastellen und n
  92.   Nachkommastellen. Ist exp=TRUE, dann wird auch ein Exponent erzeugt. str
  93.   muß ohne Exponent mindestens n+v+3 und mit Exponent mindestens n+v+7
  94.   Zeichen lang sein. Das Ergebnis ist TRUE, wenn die Zahl in die vorgegebene
  95.   Schablone paßt.
  96.  
  97.   Beispiel:
  98.  
  99.     RealToString(123.456,str,1,7,TRUE) wandelt 123.456 in die
  100.     wissenschaftliche Darstellng um. Das Ergebnis ist "1.23456700E+02".
  101.  
  102. *)
  103.  
  104. VAR
  105.   c: INTEGER;
  106.   e: LONGINT;
  107.   res: BOOLEAN;
  108.  
  109.   PROCEDURE Int(i: REAL; n: INTEGER);
  110.   VAR d: LONGINT;
  111.       m: INTEGER;
  112.       j: REAL;
  113.   BEGIN
  114.     INC(c,n); m := 0;
  115.     WHILE m<n DO
  116.       INC(m); j := i/10;
  117.       d := ENTIER(i-10*math.Floor(j));
  118.       CASE d OF 0..9: ELSE d := 0 END;
  119.       str[c-m] := CHR(d+ORD("0"));
  120.       i := j;
  121.     END;
  122.     IF i>=1 THEN res := FALSE END;
  123.   END Int;
  124.  
  125. BEGIN
  126.   c := 0; e := 0; res := TRUE;
  127.   IF r<0 THEN str[c] := "-"; r := -r;
  128.          ELSE str[c] := " " END;
  129.   INC(c);
  130.   IF exp THEN
  131.     IF r=0 THEN e := 0 ELSE
  132.       e := ENTIER(math.Floor(trans.Log10(r)));
  133.       IF (e>0) & (e<v) THEN e := 0 END;
  134.     END;
  135.     r := trans.Pow(-e,10) * r;
  136.   END;
  137.   r := r + trans.Pow(n,0.1)/2;
  138.   Int(r,v);
  139.   IF n>0 THEN
  140.     str[c] := ".";
  141.     INC(c);
  142.     Int(trans.Pow(n,10) * (r-math.Floor(r)),n);
  143.   END;
  144.   IF exp THEN
  145.     IF e#0 THEN
  146.       str[c] := "E"; INC(c);
  147.       IF e<0 THEN str[c] := "-"; e := -e;
  148.              ELSE str[c] := "+" END;
  149.       INC(c); Int(e,2);
  150.     ELSE
  151.       n := 4;
  152.       REPEAT str[c] := " "; INC(c); DEC(n) UNTIL n=0;
  153.     END;
  154.   END;
  155.   n := 1;
  156.   WHILE (n<v) & (str[n]="0") DO str[n] := " "; INC(n) END;
  157.   str[c] := 0X;
  158.   RETURN res;
  159. END RealToString;
  160.  
  161.  
  162. END RealConversions.
  163.  
  164.