home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / m2 / CycloneModules.lha / modules / txt / RealConvert.mod < prev    next >
Text File  |  1997-01-03  |  2KB  |  99 lines

  1. IMPLEMENTATION MODULE RealConvert;
  2.  
  3. (* (C) Copyright 1994 Marcel Timmermans. All rights reserved. *)
  4.  
  5. FROM SYSTEM IMPORT ASSEMBLE;
  6. IMPORT mt:MathIEEESingTrans,
  7.        mb:MathIEEESingBas;
  8.  
  9. PROCEDURE RealToString(r:REAL; VAR str: ARRAY OF CHAR; m,n:INTEGER;exp:BOOLEAN;VAR err:BOOLEAN);
  10. VAR d,e,j,v:LONGINT;
  11.     neg:BOOLEAN;
  12.  
  13. PROCEDURE Fill(c:CHAR); 
  14. BEGIN
  15.  str[j]:=c; INC(j);
  16. END Fill;
  17.  
  18. BEGIN
  19.   err:=TRUE; str[0]:=0C; j:=0; d:=0;  v:=0;
  20.   IF (m<=0) OR (n<0) THEN RETURN END;
  21.   e:=0; 
  22.   neg:=r<0.0; 
  23.   IF neg THEN r:=-r; END;
  24.   IF m>HIGH(str) THEN m:=HIGH(str); END;
  25.   r:=r+(mt.Pow(0.1,REAL(n))/2.0);
  26.   WHILE r>=10.0 DO r:=r/10.0; INC(e); END; (* get exponent *)
  27.   IF exp THEN
  28.     IF r#0.0 THEN
  29.       WHILE r<1.0 DO r:=r*10.0; DEC(e); END; 
  30.     END;
  31.   END;
  32.   d:=e; (* DEC(d,e);*)
  33.   IF neg THEN Fill('-') END;
  34.   LOOP
  35.    v:=TRUNC(r); 
  36.    Fill(CHR(48+v)); 
  37.    r:=(r-REAL(v))*10.0;
  38.    IF d=-n THEN EXIT END;
  39.    IF d=0 THEN Fill('.') END;
  40.    DEC(d);
  41.   END;
  42.   IF exp THEN
  43.    Fill('E'); 
  44.    IF e<0 THEN e:=-e; Fill('-') ELSE Fill('+') END;
  45.    d:=100;
  46.    FOR v:=1 TO 2 DO d:=d DIV 10; Fill(CHR(48+e DIV d)); e:=e MOD d; END
  47.   END;
  48.   IF j<=HIGH(str) THEN Fill(0C) END; err:=FALSE;
  49. END RealToString;
  50.  
  51.  
  52. PROCEDURE StringToReal(str:ARRAY OF CHAR;VAR r:REAL;VAR err:BOOLEAN);
  53. VAR ch:CHAR;
  54.      j,m:INTEGER;
  55.     tr:REAL;
  56.     neg:BOOLEAN;
  57.  
  58.   PROCEDURE next; 
  59.   BEGIN
  60.     REPEAT
  61.       IF j>HIGH(str) THEN ch:=0C; ELSE ch:=str[j]; END;
  62.       INC(j);
  63.     UNTIL ch#' '; 
  64.   END next;
  65.   
  66.   PROCEDURE num():REAL;
  67.   VAR rv:REAL;
  68.   BEGIN
  69.     rv:=0.0; m:=0;
  70.     LOOP 
  71.      IF (ch>='0') & (ch<='9') THEN 
  72.       rv:=rv*10.0+REAL(ORD(ch)-ORD('0'));
  73.      ELSE
  74.       EXIT;
  75.      END;
  76.      next;
  77.      INC(m);
  78.     END;
  79.   END num;
  80.  
  81. BEGIN
  82.   j:=0; err:=TRUE; next;
  83.   neg:=ch="-"; IF neg OR (ch="+") THEN next; END;
  84.   r:=num();
  85.   IF ch="." THEN next; r:=r+num() / mt.Pow(10.0,REAL(m)) END;
  86.   IF neg THEN r:=-r; END;
  87.   IF CAP(ch)="E" THEN
  88.     next;
  89.     neg:=ch="-"; IF neg OR (ch="+") THEN next; END;
  90.     tr:=num();
  91.     IF neg THEN tr:=-tr; END;
  92.     r:=r*mt.Pow(tr,10.0);
  93.   END;
  94.   err:=ch=0C;
  95. END StringToReal;
  96.  
  97.  
  98. END RealConvert.
  99.