emery@gypsy.UUCP (11/05/86)
When we discovered the 'feature' in Ada that an implementor can pick how he rounds, we discussed various ways to get the integer part of a number. Here is the 'best' (meaning most portable) way: (p.s. this 'algorithm' is obviously language-independent) declare x : real; i : integer; -- integer part of x begin i := integer(x); if (i > x) then -- machine rounded up i := i - 1; end if; end; Dave Emery until 7 Nov: ...princeton!siemens!emery princeton!siemens!emery@seismo.css.gov after 10 Nov: linus!emery emery@mitre-bedford.arpa
firth@sei.cmu.edu (Robert Firth) (11/07/86)
Given x : float; i : integer; then the line if (i > x) then ... won't work, since ">" isn't defined between integers and floats. This is perhaps what is meant: if float(i) > x then ... However, this does not really help the hard-core numerical programmer, who most likely wants X rounded but left in FLOATING representation - since otherwise he can use only a very restricted subrange of float. What we really need is the set function FLOOR (X : FLOAT) return FLOAT; CEIL ROUND TRUNC and let's make them generic in the domain type.
arny@wayback.UUCP (Arny B. Engelson) (11/07/86)
Dave Emery writes: > > When we discovered the 'feature' in Ada that an implementor can pick how > he rounds, we discussed various ways to get the integer part of a number. > Here is the 'best' (meaning most portable) way: (p.s. this 'algorithm' > is obviously language-independent) > > declare > x : real; > i : integer; -- integer part of x > begin > i := integer(x); > if (i > x) then > -- machine rounded up > i := i - 1; > end if; > end; > The above algorithm only works for POSITIVE values of X! For example, if X = -0.7 this will return -1 instead of 0. The "integer part of a real number" is a truncate function: function Trunc (X : Float) return Integer is I : Integer := Integer (X); begin if I > 0 and then Float(I) > X then I := I - 1; elsif I < 0 and then Float(I) < X then I := I + 1; end if; return I; end Trunc; This should return whatever is before the decimal point in a floating point number. Arny B. Engelson {ihnp4 | bonnie | clyde } wayback!arny (201) 386-4816
emery@gypsy.UUCP (11/07/86)
oops, made a type mismatch mistake in the last note: comparison should be: if (real(i) > x) then i := i - 1; -- machine rounded up There is no operation ">" (L : integer, R : real).... Sorry about that, chief... Dave Emery Mitre Corp. emery@mitre-bedford.arpa