DIRECTORY Basics USING [bitsPerWord, DoubleShiftRight], Real USING [FScale, RoundLI]; Scaled: CEDAR DEFINITIONS IMPORTS Basics, Real = BEGIN Value: TYPE = MACHINE DEPENDENT RECORD [fraction: CARDINAL _ 0, integerPart: INTEGER]; zero: Value = [0, 0]; one: Value = [integerPart: 1, fraction: 0]; unit: Value = one; epsilon: Value = [integerPart: 0, fraction: 1]; oneMinusEpsilon: Value = [integerPart: 0, fraction: LAST[CARDINAL]]; half: Value = [integerPart: 0, fraction: LOOPHOLE[FIRST[INTEGER]]]; infinity: Value = LOOPHOLE[LAST[INT]]; negInfinity: Value = LOOPHOLE[FIRST[INT]]; IntRep: PROC [v: Value] RETURNS [INT] = INLINE { RETURN[LOOPHOLE[v]] }; ValRep: PROC [i: INT] RETURNS [Value] = INLINE { RETURN[LOOPHOLE[i]] }; FromInt: PROC [int: INTEGER] RETURNS [Value] = INLINE { RETURN[[integerPart: int, fraction: 0]] }; FromReal: PROC [real: REAL] RETURNS [Value] = INLINE { RETURN[ValRep[Real.RoundLI[Real.FScale[real, Basics.bitsPerWord]]]] }; PLUS: PROC [a, b: Value] RETURNS [Value] = INLINE { RETURN[ValRep[IntRep[a] + IntRep[b]]] }; MINUS: PROC [a, b: Value] RETURNS [Value] = INLINE { RETURN[ValRep[IntRep[a] - IntRep[b]]] }; UMINUS: PROC [a: Value] RETURNS [Value] = INLINE { RETURN[ValRep[-IntRep[a]]] }; TIMES: PROC [a, b: Value] RETURNS [Value]; DIVIDE: PROC [a, b: Value] RETURNS [Value]; GREATER: PROC [a, b: Value] RETURNS [BOOL] = INLINE { RETURN[IntRep[a] > IntRep[b]] }; LESS: PROC [a, b: Value] RETURNS [BOOL] = INLINE { RETURN[IntRep[a] < IntRep[b]] }; Max: PROC [a, b: Value] RETURNS [Value] = INLINE { RETURN[ValRep[MAX[IntRep[a], IntRep[b]]]] }; Min: PROC [a, b: Value] RETURNS [Value] = INLINE { RETURN[ValRep[MIN[IntRep[a], IntRep[b]]]] }; Floor: PROC [a: Value] RETURNS [INTEGER] = INLINE { RETURN[a.integerPart] }; Ceiling: PROC [a: Value] RETURNS [INTEGER] = INLINE { RETURN[Floor[PLUS[a, oneMinusEpsilon]]] }; Round: PROC [a: Value] RETURNS [INTEGER] = INLINE { RETURN[Floor[PLUS[a, half]]] }; Float: PROC [a: Value] RETURNS [REAL] = INLINE { RETURN[Real.FScale[IntRep[a], -Basics.bitsPerWord]] }; Scale: PROC [a: Value, scale: INTEGER] RETURNS [Value]; Halve: PROC [a: Value] RETURNS [Value] = INLINE { RETURN[LOOPHOLE[Basics.DoubleShiftRight[LOOPHOLE[a], 1]]] }; END. ΔScaled.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Created February 4, 1983 Edited by Michael Plass, November 15, 1983 9:59 am Doug Wyatt, March 7, 1985 5:12:27 pm PST Κσ˜codešœ ™ Kšœ Οmœ0™;K™K™2K™(—K˜šΟk ˜ Kšœžœ!˜-Kšœžœ˜—K˜KšΠblœžœž ˜Kšžœ ˜Kšœž˜K˜š œžœžœž œžœ žœžœ˜VK˜—šœ˜K˜—Kšœ+˜+šœ˜K˜—šœ/˜/K˜—šœ4žœžœ˜DK˜—šœ)žœžœžœ˜CK˜—šœžœžœžœ˜&K˜—šœžœžœžœ˜*K˜—K˜KšΟnœžœ žœžœžœžœžœ˜GKš œžœžœžœ žœžœžœ˜GK˜š œžœžœžœ˜,Kšœžœžœ$˜5K˜—š œžœžœžœ˜+Kšœžœžœ@˜QK˜—šΠknœžœžœ˜(Kšœžœžœ"˜3K˜—š‘œžœžœ˜)Kšœžœžœ"˜3K˜—š‘œžœ žœ˜'Kšœžœžœ˜(K˜—š‘œžœžœ ˜*K˜—š‘œžœžœ ˜+K˜—š‘œžœžœžœ˜*Kšœžœžœ˜+K˜—š‘œžœžœžœ˜'Kšœžœžœ˜+K˜—š œžœžœ˜'Kšœžœžœžœ˜7K˜—š œžœžœ˜'Kšœžœžœžœ˜7K˜—š œžœ žœžœ˜(Kšœžœžœ˜#K˜—š œžœ žœžœ˜*Kšœžœžœžœ˜5K˜—š œžœ žœžœ˜(Kšœžœžœžœ˜*K˜—š œžœ žœžœ˜%Kšœžœžœ0˜AK˜—š œžœžœžœ ˜7K˜—š œžœ žœ˜&Kš œžœžœžœžœ ˜GK˜—K˜Kšžœ˜—…—Ί q