Real: CEDAR DEFINITIONS = BEGIN FScale: PROC [a: REAL, scale: INTEGER] RETURNS [REAL]; -- a*(2ญscale) Fix: PROC [REAL] RETURNS [INT]; Round: PROC [REAL] RETURNS [INT]; Ceiling: PROC [REAL] RETURNS [INT]; Floor: PROC [REAL] RETURNS [INT]; MaxSinglePrecision: CARDINAL = 9; DefaultSinglePrecision: CARDINAL = 7; PairToReal: PROC [fr: INT, exp10: INTEGER] RETURNS [REAL]; RealToPair: PROC [r: REAL, precision: NAT ฌ DefaultSinglePrecision] RETURNS [type: NumberType, fr: INT, exp10: INTEGER]; PlusZero: REAL = LOOPHOLE[LONG[00000000000B]]; MinusZero: REAL = LOOPHOLE[20000000000B]; PlusInfinity: REAL = LOOPHOLE[17740000000B]; MinusInfinity: REAL = LOOPHOLE[37740000000B]; LargestNumber: REAL = LOOPHOLE[17737777777B]; -- almost infinity SmallestNormalizedNumber: REAL = LOOPHOLE[00040000000B]; NonTrappingNaN: REAL = LOOPHOLE[17740000001B]; TrappingNaN: REAL = LOOPHOLE[17740000002B]; TrapNonTrappingNaN: CARD = LONG[1]; TrapTrappingNaN: CARD = LONG[2]; AddInfinityNaN: CARD = LONG[3]; MultiplyInfinityNaN: CARD = LONG[4]; DivideInfinityNaN: CARD = LONG[5]; SqRtNaN: CARD = LONG[6]; Flag: TYPE = BOOL ฌ FALSE; Exception: TYPE = MACHINE DEPENDENT{ fixOverflow, inexactResult, invalidOperation, divisionByZero, overflow, underflow}; ExceptionFlags: TYPE = PACKED ARRAY Exception OF Flag; NoExceptions: ExceptionFlags = ALL[FALSE]; AllExceptions: ExceptionFlags = ALL[TRUE]; UsualExceptions: ExceptionFlags = [ fixOverflow: TRUE, invalidOperation: TRUE, divisionByZero: TRUE, overflow: TRUE ]; NumberType: TYPE = MACHINE DEPENDENT { normal, zero, infinity, nan }; Extended: TYPE = RECORD [type: NumberType, sign: BOOL, exp: INTEGER, frac: CARD]; RealException: SIGNAL [flags: ExceptionFlags, vp: REF Extended] RETURNS [clientFixup: BOOL ฌ FALSE]; RealError: ERROR; GetStickyFlags: PROC RETURNS [ExceptionFlags]; SetStickyFlags: PROC [new: ExceptionFlags ฌ NoExceptions] RETURNS [old: ExceptionFlags]; END. T Real.mesa Copyright ำ 1985, 1986, 1987, 1988, 1991 by Xerox Corporation. All rights reserved. For Portable Cedar Stewart, September 1, 1982 10:03 am Rovner, May 13, 1983 1:13 pm Levin, August 8, 1983 4:15 pm Russ Atkinson (RRA) February 19, 1985 5:03:31 pm PST Carl Hauser, February 10, 1988 10:10:14 am PST Doug Wyatt, August 27, 1991 1:49 pm PDT Operations on REAL numbers. See IEEE floating point standard for more information. Rounding ... rounds toward zero (mode rz). ... rounds to nearest, unbiased (mode rn). ... rounds toward plus infinity (mode rp). ... rounds toward minus infinity (mode rm). Decimal conversion # of decimal places needed to always exactly reproduce the given real number. # of decimal places that are normally fully significant ... converts the value fr*10**exp10 to real. ... converts value r to fr*10**exp10; fr will have precision significant digits. Constants You may want to use TrappingNaN to initialize storage. These values may be encountered as vp.frac during an exception. Exceptions Extended is the internal form of a single precision floating point number. If the type of a value is infinity or zero, only the sign is interesting. In these cases, exp and frac are undefined. If type = nan, then exp is undefined and frac contains the nan significand. Some constant nans are defined above. If type = normal, then sign, exp, and frac describe the value: if sign is true, then the number is negative; exp is the binary exponent; frac is the significand (the binary point is between bits 0 and 1 - normalized numbers are between 1 and 2). RealException is raised if any enabled exception occurs. Flags reports all the exceptions which occurred during the faulted operation (including those which are disabled). On RESUME, if clientFixup is TRUE, the client is expected to have fixed up the reference. If clientFixup is FALSE the standard fixup will happen. Operations in this interface only raise RealException on the conditions mentioned in UsualExceptions, above. Usually, RealException can be resumed, but certain exceptions, such as invalidOperation raised as a result of compare or one of the Fixes, cannot be resumed. If a RESUME is done in such a case, the ERROR RealError is raised. The six kinds of exceptions have independent "sticky" flags that remember if the exception has occurred since the last call to SetStickyFlags. SetStickyFlags is provided so that procedures may save and restore the state for others. 4-Feb-81 18:42:11, L. Stewart, fixed TrappingNaN to be of type REAL June 3, 1982 10:36 am, L. Stewart, added REF, SqRt, FScale, removed STRING September 1, 1982 10:03 am, L. Stewart, CompareREAL, Cedar 3.4 May 13, 1983 1:13 pm, Paul Rovner, conversion to Cedar 5.0 Russ Atkinson (RRA) February 19, 1985 5:02:31 pm PST General cleanup, especially to improve readability Doug Wyatt, February 25, 1985 2:17:58 pm PST More cleanup. Removed initialization stuff. Doug Wyatt, December 11, 1986 2:03:29 pm PST Removed FixLI and RoundLI (use Fix and Round). Carl Hauser, January 20, 1988 3:13:21 pm PST Removed all the machine code procedures for Portable Cedar version สฎ•NewlineDelimiter –(cedarcode) style™codešœ ™ Kšœ ฯeœI™TKšฯb™Kšœ#™#Kšœ™Kšœ™J™4K™.K™'—K˜K™Kšœฯkœ ™Kšœ6™6K˜šฯnœŸœŸ œŸ˜K˜Kš  œŸœŸœ ŸœŸœŸœฯc˜E—head™š  œŸœŸœŸœŸœ˜Kšœ!™!K™—š  œŸœŸœŸœŸœ˜!Kšœ*™*K™—š  œŸœŸœŸœŸœ˜#Kšœ*™*K™—š  œŸœŸœŸœŸœ˜!Kšœ+™+K™——™šœŸœ˜!KšœM™M—šœŸœ˜%Kšœ7™7—K˜š   œŸœŸœ ŸœŸœŸœ˜:Kšœ,™,K™—š  œŸœŸœ ŸœŸ œŸœ Ÿœ˜yKšœP™PK™——šœ ™ Kšœ ŸœŸœŸœ˜.Kšœ ŸœŸœ˜)KšœŸœŸœ˜,KšœŸœŸœ˜-KšœŸœŸœก˜@KšœŸœŸœ˜8K˜KšœŸœŸœ˜.šœ ŸœŸœ˜+Kšœ6™6—K˜KšœŸœŸœ˜#KšœŸœŸœ˜ KšœŸœŸœ˜KšœŸœŸœ˜$KšœŸœŸœ˜"šœ ŸœŸœ˜Kšœ?™?——šœ ™ šœŸœŸœŸœ˜K™—šœ ŸœŸœŸ œ˜$K˜SK˜—š œŸœŸœŸœ Ÿœ˜6K™—KšœŸœŸœ˜*Kšœ ŸœŸœ˜*šœ#˜#Kšœ Ÿœ˜KšœŸœ˜KšœŸœ˜Kšœ Ÿ˜Kšœ˜—K˜šœ ŸœŸœŸ œ!˜EK˜—š œ ŸœŸœŸœŸœŸœ˜QKšœญ™ญK˜—K˜Kš   œŸœŸœ ŸœŸœŸœ˜eš  œŸœ˜Kš œฑŸœŸœLŸœดŸœŸœ™‘K™—K™Kš œŸœŸœ˜.š œŸœ%Ÿœ˜XKšœ่™่K˜——K˜šŸœ˜KšœŸœ+Ÿ™CKšœŸœŸœŸ™JKšœŸœ!™>K™:™4Kšœ2™2—™,K™,—™,K™.—™,K™B—K™——…—|~