<> <> <> DIRECTORY BitOps, Dragon, IO, QCard; DragonReal: CEDAR DEFINITIONS = BEGIN Real: TYPE = MACHINE DEPENDENT RECORD [ sign (0: 0.. 0): BOOL _ FALSE, exp (0: 1.. 8): [0..400B) _ 0, frac0 (0: 9..15): [0..200B) _ 0, frac1 (0:16..31): CARDINAL _ 0]; RealDbl: TYPE = MACHINE DEPENDENT RECORD [ sign (0: 0.. 0): BOOL _ FALSE, exp (0: 1..11): [0..4000B) _ 0, frac0 (0:12..15): [0.. 20B) _ 0, frac1 (0:16..31): CARDINAL _ 0, frac2 (0:32..47): CARDINAL _ 0, frac3 (0:48..63): CARDINAL _ 0]; Ext: TYPE = REF ExtRec; ExtRec: TYPE = RECORD [ sign: BOOL _ FALSE, type: NumberType _ normal, double: BOOL _ FALSE, sticky: BOOL _ FALSE, exp: INTEGER _ 0, sig: QCard.QCARD _ ALL[0]]; RoundType: TYPE = MACHINE DEPENDENT {nearest, zero, plus, minus}; NumberType: TYPE = {normal, zero, infinity, nan, integer, decimal}; QINT: TYPE = RECORD [sign: BOOL, val: QCard.QCARD]; RealFromINT: PROC [int: INT] RETURNS [Real]; RealDblFromQINT: PROC [int: QINT] RETURNS [RealDbl]; RealToINT: PROC [r: Real] RETURNS [type: NumberType, int: INT]; RealDblToQINT: PROC [r: RealDbl] RETURNS [type: NumberType, int: QINT]; RealFromDec: PROC [int: INT, exp10: INT] RETURNS [Real]; RealDblFromDec: PROC [int: QINT, exp10: INT] RETURNS [RealDbl]; RealToDec: PROC [r: REAL, precision: NAT _ DefaultSinglePrecision] RETURNS [type: NumberType, int: INT, exp10: INT]; RealDblToDec: PROC [r: RealDbl, precision: NAT _ DefaultDoublePrecision] RETURNS [type: NumberType, int: QINT, exp10: INT]; <<>> <> DefaultSinglePrecision: CARDINAL = 7; MaxSinglePrecision: CARDINAL = 9; DefaultDoublePrecision: CARDINAL = 17; MaxDoublePrecision: CARDINAL = 19; <> <> BitOn: PROC [a, b: UNSPECIFIED] RETURNS [BOOLEAN] = INLINE { RETURN[PrincOpsUtils.BITAND[a, b] # 0]; }; Swaw: PROC [r: LONG UNSPECIFIED] RETURNS [LONG UNSPECIFIED] = MACHINE CODE { PrincOps.zEXCH; }; <<>> <<>> <> <<>> <> <> PlusZero: Real = [FALSE, 000B, 000B, 000000B]; MinusZero: Real = [TRUE, 000B, 000B, 000000B]; PlusInfinity: Real = [FALSE, 377B, 000B, 000000B]; MinusInfinity: Real = [TRUE, 377B, 000B, 000000B]; LargestNumber: Real = [FALSE, 376B, 177B, 177777B]; SmallestNormal: Real = [FALSE, 000B, 100B, 000000B]; NonTrappingNaN: Real = [FALSE, 377B, 000B, 000001B]; TrappingNaN: Real = [FALSE, 377B, 000B, 000002B]; -- storage initialization <<>> <> PlusZeroDbl: RealDbl = [FALSE, 0000B, 00B, 000000B, 000000B, 000000B]; MinusZeroDbl: RealDbl = [TRUE, 0000B, 00B, 000000B, 000000B, 000000B]; PlusInfinityDbl: RealDbl = [FALSE, 3777B, 00B, 000000B, 000000B, 000000B]; MinusInfinityDbl: RealDbl = [TRUE, 3777B, 00B, 000000B, 000000B, 000000B]; LargestNumberDbl: RealDbl = [FALSE, 3776B, 17B, 177777B, 177777B, 177777B]; SmallestNormalDbl: RealDbl = [FALSE, 0000B, 10B, 000000B, 000000B, 000000B]; <> TrapNonTrappingNaN: QCARD = [0,0,0,1]; TrapTrappingNaN: QCARD = [0,0,0,2]; AddInfinityNaN: QCARD = [0,0,0,3]; MultiplyInfinityNaN: QCARD = [0,0,0,4]; DivideInfinityNaN: QCARD = [0,0,0,5]; SqRtNaN: QCARD = [0,0,0,6]; <> Flag: TYPE = BOOLEAN _ 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]; <> GetStickyFlags: PROC RETURNS [ExceptionFlags]; SetStickyFlags: PROC [new: ExceptionFlags _ NoExceptions] RETURNS [old: ExceptionFlags]; RealError: ERROR; RealException: SIGNAL [flags: ExceptionFlags, vp: REF Extended] RETURNS [clientFixup: BOOLEAN _ FALSE]; <<>> <> <<>> <<>> <> <> <> <> <> InitReals: PROC; RealControl: UNSAFE PROGRAM; <> Fix: PROC [REAL] RETURNS [INT]; FixI: PROC [REAL] RETURNS [INTEGER]; FixC: PROC [REAL] RETURNS [CARDINAL]; <> RoundLI: PROC [REAL] RETURNS [INT]; RoundI: PROC [REAL] RETURNS [INTEGER]; RoundC: PROC [REAL] RETURNS [CARDINAL]; FRem: PROC [a, b: REAL] RETURNS [REAL]; SqRt: PROC [REAL] RETURNS [REAL]; CompareREAL: PROC [a, b: REAL] RETURNS [Basics.Comparison]; <> FAdd: PROC [a, b: REAL] RETURNS [REAL]; FSub: PROC [a, b: REAL] RETURNS [REAL]; FMul: PROC [a, b: REAL] RETURNS [REAL]; FDiv: PROC [a, b: REAL] RETURNS [REAL]; FComp: PROC [a, b: REAL] RETURNS [INTEGER]; Float: PROC [INT] RETURNS [REAL]; FScale: PROC [a: REAL, scale: INTEGER] RETURNS [REAL]; END.