home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1993-10-23 | 5.4 KB | 176 lines |
- IMPLEMENTATION MODULE RealInOut ;
-
- FROM InOut IMPORT ReadString , WriteString ;
- FROM SYSTEM IMPORT VAL ;
-
-
- PROCEDURE exponentten( i : INTEGER ) : REAL ;
- VAR x, w : REAL ;
- expsign : BOOLEAN ;
- BEGIN
- x := 10.0 ; w := 1.0 ;
- IF i < 0 THEN
- expsign := TRUE ; i := - i
- ELSE
- expsign := FALSE
- END ;
- WHILE i > 0 DO
- IF ODD( i ) THEN w := w * x END ;
- x := x * x ;
- i := i DIV 2
- END ;
- IF expsign THEN w := 1.0 / w END ;
- RETURN w
- END exponentten;
-
- PROCEDURE RealToString(VAR S:ARRAY OF CHAR; real :REAL; N :CARDINAL ):BOOLEAN;
- TYPE TrickRecord = RECORD
- CASE : CARDINAL OF
- 0: r: REAL |
- 1: ch, cl: CARDINAL
- END
- END;
- VAR
- maxlength, minsize, index, lvar : CARDINAL ;
- trick : TrickRecord ;
- exp2, exp10 : INTEGER ;
- eps : REAL ;
- BEGIN
- maxlength := HIGH( S ) ; index := 0 ;
- IF real < 0.0 THEN
- S[index] := '-' ; INC( index ) ;
- real := - real ; minsize := 7 ;
- ELSE
- minsize := 6
- END ;
- IF (N < minsize) OR (maxlength <= N) THEN
- RETURN FALSE
- END ;
- N := N - minsize ;
- IF real = 0.0 THEN
- S[index] := '0' ;
- INC( index ) ;
- S[index] := '.' ;
- INC( index ) ;
- FOR lvar := 1 TO N DO
- S[index] := '0' ;
- INC( index )
- END ;
- exp10 := 0 ;
- ELSE
- trick.r := real ;
- exp2 := VAL( INTEGER, trick.ch DIV 128 ) - 127;
- IF exp2 >= 0 THEN
- exp10 := TRUNC(FLOAT(exp2) * 0.3)
- ELSE
- exp10 := - TRUNC(FLOAT(-exp2) * 0.3)
- END;
- eps := 0.5 * exponentten( 0 - VAL( INTEGER , N ) );
- WHILE real * exponentten(-exp10) + eps < 1.0 DO DEC (exp10) END;
- WHILE real * exponentten(-exp10) + eps >= 10.0 DO INC (exp10) END;
- real := real * exponentten(-exp10) + eps (* Rundung *);
- S[index] := CHR(ORD(TRUNC( real )) + 48 ) ;
- INC( index ) ;
- S[index] := '.' ;
- INC( index ) ;
- FOR lvar := 1 TO N DO
- real := real - FLOAT (TRUNC (real));
- real := real * 10.0;
- S[index] := CHR(ORD(TRUNC( real )) + 48) ;
- INC( index )
- END
- END;
- S[index] := 'E' ;
- INC( index ) ;
- IF exp10 < 0 THEN S[index] := '-' ; exp10 := -exp10
- ELSE S[index] := '+' END ;
- INC( index ) ;
- S[index] := CHR(ORD( exp10 DIV 10 ) + 48 ) ;
- INC( index ) ;
- S[index] := CHR(ORD( exp10 MOD 10 ) + 48 ) ;
- INC( index ) ;
- S[index] := 0C ;
- RETURN TRUE
- END RealToString;
-
- PROCEDURE StringToReal( A : ARRAY OF CHAR ; VAR RES : REAL ) : BOOLEAN ;
- VAR index : CARDINAL ;
- exponent : INTEGER ;
- mantisse , stelle: REAL ;
- vorzeichen : BOOLEAN ;
- exponentvorzeichen : BOOLEAN ;
- BEGIN
- A[HIGH(A)] := 0C ;
- index := 0 ; exponent := 0 ;
- vorzeichen := FALSE ;
- exponentvorzeichen := FALSE ;
- WHILE A[index] = ' ' DO INC( index ) END ;
- IF (A[index] = '-') OR (A[index] = '+') THEN
- vorzeichen := A[index] = '-' ; INC(index)
- END ;
- WHILE A[index] = ' ' DO INC( index ) END ;
- mantisse := 0.0 ;
- IF ( A[index] >= '0' ) AND ( A[index] <= '9' ) THEN
- REPEAT
- mantisse := mantisse * 10.0 + FLOAT(ORD( A[index] ) - 48) ;
- INC( index )
- UNTIL (A[index] < '0') OR (A[index] > '9')
- ELSE
- RETURN FALSE
- END ;
- IF A[index] ='.' THEN
- INC( index ) ;
- stelle := 0.1 ;
- WHILE (A[index] >= '0') AND (A[index] <= '9') DO
- mantisse := mantisse + FLOAT(ORD( A[index] ) - 48) * stelle ;
- stelle := stelle * 1.0E-1 ;
- INC( index )
- END
- END ;
- IF A[index] = 'E' THEN
- INC( index ) ;
- IF (A[index] = '-') OR (A[index] = '+') THEN
- exponentvorzeichen := A[index] = '-' ;
- INC( index )
- END ;
- IF ( A[index] >= '0' ) AND ( A[index] <= '9' ) THEN
- REPEAT
- exponent := exponent * 10 + ORD(A[index]) - 48 ;
- INC( index )
- UNTIL (A[index] < '0') OR (A[index] > '9')
- ELSE
- RETURN FALSE
- END
- END ;
- IF vorzeichen THEN mantisse := - mantisse END ;
- IF exponentvorzeichen THEN exponent := - exponent END ;
- RES := mantisse * exponentten( exponent ) ;
- RETURN (( A[index] = 0C ) OR ( A[index] = ' ' ) OR ( A[index] = 13C ))
- END StringToReal ;
-
- PROCEDURE ReadReal( VAR real : REAL ) ;
- VAR InputString : ARRAY [0..60] OF CHAR ;
- TmpReal : REAL ;
- BEGIN
- ReadString( InputString ) ;
- Done := StringToReal( InputString , TmpReal ) ;
- IF Done THEN real := TmpReal
- ELSE real := 0.0
- END
- END ReadReal ;
-
- PROCEDURE WriteReal( real : REAL ; n : CARDINAL ) ;
- VAR OutputString : ARRAY [0..60] OF CHAR ;
- BEGIN
- Done := RealToString( OutputString , real , n ) ;
- IF Done THEN WriteString( OutputString )
- ELSE WriteString( "Error in RealOutput ! " )
- END
- END WriteReal ;
-
- END RealInOut .
-
-
-
-
-