<> <> <> <> <> <> <> DIRECTORY Basics USING [Comparison], PrincOps USING [zINC, zMISC, aFIX, aFIXI, aFIXC, aROUND, aROUNDI, aROUNDC, aFREM, aFSQRT, aFCOMP, aFADD, aFSUB, aFMUL, aFDIV, aFLOAT, aFSC]; <<>> <> <> Real: CEDAR DEFINITIONS = BEGIN <> Fix: PROC [REAL] RETURNS [INT] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFIX; }; <<... converts REAL to INT by truncating (mode rz).>> <<>> FixLI: PROC [REAL] RETURNS [INT] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFIX; }; <<... same as Fix (LI stands for LONG INTEGER).>> FixI: PROC [REAL] RETURNS [INTEGER] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFIXI; }; <<... converts REAL to INTEGER by truncating (mode rz).>> FixC: PROC [REAL] RETURNS [CARDINAL] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFIXC; }; <<... converts REAL to CARDINAL by truncating (mode rz).>> Round: PROC [REAL] RETURNS [INT] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aROUND; }; <<... converts REAL to INT by rounding (mode rn).>> RoundLI: PROC [REAL] RETURNS [INT] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aROUND; }; <<... same as Round (LI stands for LONG INTEGER).>> RoundI: PROC [REAL] RETURNS [INTEGER] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aROUNDI; }; <<... converts REAL to INTEGER by rounding (mode rn).>> RoundC: PROC [REAL] RETURNS [CARDINAL] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aROUNDC; }; <<... converts REAL to CARDINAL by rounding (mode rn).>> CompareREAL: PROC [a, b: REAL] RETURNS [Basics.Comparison] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFCOMP; PrincOps.zINC; }; <<... compares two REALs.>> SqRt: PROC [REAL] RETURNS [REAL] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFSQRT; }; <> <<>> FRem: PROC [a, b: REAL] RETURNS [REAL] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFREM; }; <> <<>> <> <<>> FAdd: PROC [a, b: REAL] RETURNS [REAL] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFADD; }; -- a+b <<>> FSub: PROC [a, b: REAL] RETURNS [REAL] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFSUB; }; -- a-b FMul: PROC [a, b: REAL] RETURNS [REAL] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFMUL; }; -- a*b FDiv: PROC [a, b: REAL] RETURNS [REAL] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFDIV; }; -- a/b FComp: PROC [a, b: REAL] RETURNS [INTEGER] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFCOMP; }; -- (a -1, (a=b) => 0, (a>b) => +1 <<>> FScale: PROC [a: REAL, scale: INTEGER] RETURNS [REAL] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFSC; }; -- a*(2^scale) Float: PROC [i: INT] RETURNS [REAL] = TRUSTED MACHINE CODE { PrincOps.zMISC, PrincOps.aFLOAT; }; -- REAL[i] <> MaxSinglePrecision: CARDINAL = 9; <<# of decimal places needed to always exactly reproduce the given real number.>> DefaultSinglePrecision: CARDINAL = 7; <<# of decimal places that are normally fully significant>> PairToReal: PROC [fr: INT, exp10: INTEGER] RETURNS [REAL]; <<... converts the value fr*10**exp10 to real.>> <<>> RealToPair: PROC [r: REAL, precision: NAT _ DefaultSinglePrecision] RETURNS [type: NumberType, fr: INT, exp10: INTEGER]; <<... converts value r to fr*10**exp10; fr will have precision significant digits.>> <<>> <> 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: LONG CARDINAL = LONG[1]; TrapTrappingNaN: LONG CARDINAL = LONG[2]; AddInfinityNaN: LONG CARDINAL = LONG[3]; MultiplyInfinityNaN: LONG CARDINAL = LONG[4]; DivideInfinityNaN: LONG CARDINAL = LONG[5]; SqRtNaN: LONG CARDINAL = 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: LONG CARDINAL ]; <> 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. <<4-Feb-81 18:42:11, L. Stewart, fixed TrappingNaN to be of type REAL>> <> <> <> <> <> <> <> <<>> <<>>