DIRECTORY Basics USING [BITSHIFT, bitsPerWord, HighHalf, LongMult], Scaled USING [Float, FromReal, UMINUS, Value]; ScaledImpl: CEDAR PROGRAM IMPORTS Basics, Scaled EXPORTS Scaled = BEGIN bitsPerWord: INTEGER = Basics.bitsPerWord; Value: TYPE = Scaled.Value; TIMES: PUBLIC PROC [a, b: Value] RETURNS [Value] = { pos: BOOLEAN _ (a.integerPart >= 0) = (b.integerPart >= 0); prod: Value; IF a.integerPart < 0 THEN a _ a.UMINUS[]; IF b.integerPart < 0 THEN b _ b.UMINUS[]; prod.fraction _ Basics.HighHalf[Basics.LongMult[a.fraction, b.fraction] + (CARDINAL[LAST[NAT]]+1)]; prod.integerPart _ a.integerPart * b.integerPart; prod _ LOOPHOLE[ LOOPHOLE[prod, LONG CARDINAL] + Basics.LongMult[a.integerPart, b.fraction] + Basics.LongMult[a.fraction, b.integerPart] ]; RETURN[IF pos THEN prod ELSE prod.UMINUS[]]; }; DIVIDE: PUBLIC PROC [a, b: Value] RETURNS [Value] = { RETURN[Scaled.FromReal[a.Float[]/b.Float[]]]; }; Scale: PUBLIC PROC [a: Value, scale: INTEGER] RETURNS [Value] = { IF scale >= 0 THEN { WHILE scale >= bitsPerWord DO a.integerPart _ LOOPHOLE[a.fraction]; a.fraction _ 0; scale _ scale - bitsPerWord; ENDLOOP; a.integerPart _ LOOPHOLE[Basics.BITSHIFT[LOOPHOLE[a.integerPart], scale] + Basics.BITSHIFT[a.fraction, scale-bitsPerWord]]; a.fraction _ Basics.BITSHIFT[a.fraction, scale]; } ELSE { sign: CARDINAL = IF a.integerPart >= 0 THEN 0 ELSE LAST[CARDINAL]; WHILE scale <= -bitsPerWord DO a.fraction _ LOOPHOLE[a.integerPart]; a.integerPart _ LOOPHOLE[sign]; scale _ scale + bitsPerWord; ENDLOOP; a.fraction _ Basics.BITSHIFT[LOOPHOLE[a.integerPart], scale+bitsPerWord] + Basics.BITSHIFT[a.fraction, scale]; a.integerPart _ LOOPHOLE[Basics.BITSHIFT[LOOPHOLE[a.integerPart], scale] + Basics.BITSHIFT[sign, scale+bitsPerWord]]; }; RETURN[a]; }; END. ΖScaledImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Created February 16, 1983 Edited by Michael Plass, March 2, 1983 10:43 am Doug Wyatt, June 17, 1985 2:44:33 pm PDT Κ©˜codešœ™Kšœ Οmœ1™