DIRECTORY Basics, Real, Scaled ; ScaledImpl: CEDAR PROGRAM IMPORTS Basics, Real, 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 _ INTEGER[Basics.BITSHIFT[a.integerPart, scale]] + INTEGER[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 _ CARDINAL[Basics.BITSHIFT[a.integerPart, scale+bitsPerWord]] + CARDINAL[Basics.BITSHIFT[a.fraction, scale]]; a.integerPart _ INTEGER[Basics.BITSHIFT[a.integerPart, scale]] + INTEGER[Basics.BITSHIFT[sign, scale+bitsPerWord]]; }; RETURN[a]; }; END. `ScaledImpl.mesa Created February 16, 1983 Edited by Michael Plass, March 2, 1983 10:43 am Κt˜Jšœ™J™J™/šΟk ˜ J˜J˜Jšœ˜J˜—šœ œ˜Jšœ˜Jšœ˜Jšœ˜Iunitšœ œ˜*Kšœœ˜šΠknœœœœ ˜4Jšœœ/˜;Jšœ ˜ Jšœœœ˜)Jšœœœ˜)JšœK œœ˜cJšœ1˜1šœœ˜Jšœœœ[˜wJšœ˜—Jš œœœœœ˜,Jšœ˜—šžœœœœ ˜5Jšœ'˜-Jšœ˜—š Οnœœœœœ ˜Ašœ œ˜šœ˜Jšœœ ˜%Jšœ˜Jšœ˜Jšœ˜—Jš œœœœœ!˜yJšœœ˜0J˜—šœ˜Jš œœœœœœœ˜Bšœ˜Jšœ œ˜%Jšœœ˜Jšœ˜Jšœ˜—Jš œ œœ&œœ˜xJš œœœœœ˜sJšœ˜—Jšœ˜ Jšœ˜—Kšœ˜——…—š n