home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1994-09-22 | 5.7 KB | 161 lines |
- DEFINITION MODULE RealInOut;
-
- (* Real input output as per Wirth with extensions
-
- All items (except Done) exists in normal and long versions.*)
-
- VAR Done : BOOLEAN;
- (* TRUE if ReadReal or StringToReal returns correct number *)
-
- (* The two first PORCEDUREs don't normaly belong to RealInOut.
- They provide means to overcome two serious problems using
- the TYPE LONGREAL in this Modula-2, and are placed in this
- MODULE only because it is most probably imported to all
- programs using LONGREALs.
- Examples on how to use LONGREALs can be found in REALINOU.MOD,
- LONGMATH.MOD, and TEST.MOD *)
-
- PROCEDURE Rec(x : LONGREAL) : LONGREAL;
- (* Returns 1.0/x in full precision. Use this instead of
- long division if full double precision is needed
- with this Modula-2 !
- The standard division '/' is only correct to about the
- 10th significant digit, but faster then Rec *)
-
- PROCEDURE Long(a,b,c,d,e,exp : INTEGER) : LONGREAL;
- (* Returns a LONGREAL composed of the six INTEGER arguments.
- This should help to overcome some of the problems with
- non-existing CONSTants of LONGREAL type.
- a, b, c, d, and e should all be positive constants with
- four decimal digits.
- A decimal point should be imagined between the
- two first digits of a.
- a, b, c, d, and e are concatenated to a long real number.
- exp is the exponent to ten.
- For example
- LONG(1234,5678,9012,3456,7890,-123)
- = 1.2345678901234567890E-123
- StringToLongReal below provides an alternative to Long.
- (LONG)CARDinals can be converted by FLOATD.
- (LONG)INTegers can be converted by System.FLOATd.
- REALs can be converted by System.FLONG or by assignment
- (both with reduced precision) *)
-
- PROCEDURE ReadReal(VAR x : REAL);
-
- PROCEDURE ReadLongReal(VAR x : LONGREAL);
-
- PROCEDURE StringToReal
- (VAR Text : ARRAY OF CHAR; VAR x : REAL; VAR ReadOK : BOOLEAN);
-
- PROCEDURE StringToLongReal
- (VAR Text : ARRAY OF CHAR; VAR x : LONGREAL; VAR ReadOK : BOOLEAN);
-
- (* Convert a string to a real number
-
- Syntax is [+!-][d*][.d*][E[+!-]d*]
-
- eg 1.0
- 2
- .3
- E3
- 3.45E-17
-
- Termination character is returned in
- termCH from InOut (since this module is
- effectively an extension of InOut)
-
- The StringToReal routines allow you to read a real number
- from a string.
- *)
-
- VAR
-
- Engineering : BOOLEAN (* = FALSE *);
-
- LongEngineering : BOOLEAN (* = FALSE *);
-
- (* if true, engineering exponents are used in WriteReal and
- RealToString. Engineering exponents are always multiples of 3 *)
-
- SigDigits : INTEGER (* = 8 *);
-
- LongSigDigits : INTEGER (* = 16 *);
-
- (* number of significant digits in WriteReal and RealToString *)
-
- ForceExponent : BOOLEAN (* = TRUE *);
-
- LongForceExponent : BOOLEAN (* = TRUE *);
-
- (* set to false to not output exponents of zero on floating point
- numbers*)
-
- PROCEDURE WriteReal(x : REAL; size : INTEGER);
-
- PROCEDURE WriteLongReal(x : LONGREAL; size : INTEGER);
-
- PROCEDURE RealToString
- (VAR Text : ARRAY OF CHAR; x : REAL; size : INTEGER);
-
- PROCEDURE LongRealToString
- (VAR Text : ARRAY OF CHAR; x : LONGREAL; size : INTEGER);
-
- (* Convert a real number to a string in mantissa + exponent form
-
- for example, 10 will be output as 1.0E+01 (Long: 1.0E+001).
-
- If Engineering is true, the number is scaled so that the
- mantissa is rounded to a multiple of 3 (the number of digits
- before the dot is increased).
-
- so, 10 will print as 10.0E+00 (Long: 10.0E+000).
-
- The layout is as follows:
-
- The rightmost 4 (Long: 5) columns of the field are reserved
- for the exponent. There must then be SigDigits+2 character
- positions left in the field (of size). If insufficient
- positions remain, extra columns are used for the number.
-
- RealToString returns the number as a zero terminated
- string in Text
- *)
-
- PROCEDURE WriteRealFixed(x : REAL; size, places : INTEGER);
-
- PROCEDURE WriteLongRealFixed(x : LONGREAL; size, places : INTEGER);
-
- PROCEDURE RealToStringFixed
- (VAR Text : ARRAY OF CHAR; x : REAL; size, places : INTEGER);
-
- PROCEDURE LongRealToStringFixed
- (VAR Text : ARRAY OF CHAR; x : LONGREAL; size, places : INTEGER);
-
- (* Write a real number in fixed point.
- size is the size of field to use.
- places is the number of places for decimals.
-
- If the number is too large to fit in the field,
- floating point format is reverted to.
-
- If the number is too small, it prints as zero.
-
- RealToStringFixed returns the value in Text, as a zero
- terminated string.
- *)
-
- PROCEDURE WriteRealOct(x : REAL; n : CARDINAL);
-
- PROCEDURE WriteLongRealOct(x : LONGREAL; n : CARDINAL);
-
- (* output real number in octal for debugging purposes *)
-
- PROCEDURE WriteRealHex(x : REAL; n : CARDINAL);
-
- PROCEDURE WriteLongRealHex(x : LONGREAL; n : CARDINAL);
-
- (* output real number in hex for debugging purposes *)
-
- END RealInOut.
-