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

  1. (*-------------------------------------------------------------------------*)
  2. (*                                                                         *)
  3. (*  Amiga Oberon Library Module: LongRealConversions  Date: 02-Nov-92      *)
  4. (*                                                                         *)
  5. (*   © 1991 by Fridtjof Siebert                                            *)
  6. (*                                                                         *)
  7. (*-------------------------------------------------------------------------*)
  8.  
  9. MODULE LongRealConversions;
  10.  
  11. IMPORT trans := MathIEEEDoubTrans,
  12.        math  := MathIEEEDoubBas;
  13.  
  14. PROCEDURE StringToReal*(VAR str: ARRAY OF CHAR;
  15.                         VAR r:   LONGREAL): 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: LONGREAL;
  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(): LONGREAL;
  47.   VAR i: LONGREAL;
  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:   LONGREAL;
  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+8
  94.   Zeichen lang sein. Das Ergebnis ist TRUE, wenn das Ergebnis in die
  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+002".
  101. *)
  102.  
  103. VAR
  104.   c: INTEGER;
  105.   e: LONGINT;
  106.   res: BOOLEAN;
  107.  
  108.   PROCEDURE Int(i: LONGREAL; n: INTEGER);
  109.   VAR d: LONGINT;
  110.       m: INTEGER;
  111.       j: LONGREAL;
  112.   BEGIN
  113.     INC(c,n); m := 0;
  114.     WHILE m<n DO
  115.       INC(m); j := i/10;
  116.       d := ENTIER(i-10*math.Floor(j));
  117.       CASE d OF 0..9: ELSE d := 0 END;
  118.       str[c-m] := CHR(d+ORD("0"));
  119.       i := j;
  120.     END;
  121.     IF i>=1 THEN res := FALSE END;
  122.   END Int;
  123.  
  124. BEGIN
  125.   c := 0; e := 0; res := TRUE;
  126.   IF r<0 THEN str[c] := "-"; r := -r;
  127.          ELSE str[c] := " " END;
  128.   INC(c);
  129.   IF exp THEN
  130.     IF r=0 THEN e := 0 ELSE
  131.       e := ENTIER(math.Floor(trans.Log10(r)));
  132.       IF (e>0) & (e<v) THEN e := 0 END;
  133.     END;
  134.     r := trans.Pow(-e,10) * r;
  135.   END;
  136.   r := r + trans.Pow(n,0.1D)/2;
  137.   Int(r,v);
  138.   IF n>0 THEN
  139.     str[c] := ".";
  140.     INC(c);
  141.     Int(trans.Pow(n,10) * (r-math.Floor(r)),n);
  142.   END;
  143.   IF exp THEN
  144.     IF e#0 THEN
  145.       str[c] := "E"; INC(c);
  146.       IF e<0 THEN str[c] := "-"; e := -e;
  147.              ELSE str[c] := "+" END;
  148.       INC(c); Int(e,3);
  149.     ELSE
  150.       n := 5;
  151.       REPEAT str[c] := " "; INC(c); DEC(n) UNTIL n=0;
  152.     END;
  153.   END;
  154.   n := 1;
  155.   WHILE (n<v) & (str[n]="0") DO str[n] := " "; INC(n) END;
  156.   str[c] := 0X;
  157.   RETURN res;
  158. END RealToString;
  159.  
  160.  
  161. END LongRealConversions.
  162.  
  163.