From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.5-pre1 (2020-06-20) on ip-172-31-74-118.ec2.internal X-Spam-Level: X-Spam-Status: No, score=-1.9 required=3.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.5-pre1 Date: 16 Nov 91 00:01:20 GMT From: milton!mfeldman@beaver.cs.washington.edu (Michael Feldman) Subject: Re: Red-faced professor gets bitten in search for portability Message-ID: <1991Nov16.000120.25606@milton.u.washington.edu> List-Id: In article <11919@spim.mips.COM> murphy@mips.com (Mike Murphy) writes: > >You are right about your first version not being portable, but >your second version seems a bit convulated to me. Why not just >check whether you indeed rounded down after doing the integer conversion? >For example: > FUNCTION Trunc (X: Float) RETURN Integer IS > itrunc : integer = integer(x - 0.5); > BEGIN > if x - float(itrunc) >= 1.0 then > -- rounded down, so add back a 1 > return itrunc+1; > else > return itrunc; > end if; > END Trunc; Sure - this seems equivalent. I kinda like the halving and doubling, because these are pretty fast to implement (as shifts) given a good optimizer. Your method has the advantage, I suppose, of being immune to a possible overflow from the doubling. >p.s. btw, some machines, e.g. MIPS, can either round down, or round up, >or round to the even number (the default setting). Right. My argument about Trunc is that it's such a common (and easy to implement) operation that it's better done as an intrinsic, so that the compiler writer can use whatever hardware trickery is available. Mike