Subject: Re: Why is (round 2.5) = 2? From: Erik Naggum <erik@naggum.no> Date: 1995/04/22 Newsgroups: comp.lang.lisp Message-ID: <19950422T110155Z.enag@naggum.no> [Dan Britt] | Except that in the range 0 | 1 ... 9 | 10, zero equals ten (with | respect to rounding). And, the real number line _does_ include | integers, so the range is 0 (exactly, not 0.00...01) through | 0.49999.... There are exactly as many real numbers between 0 and | 0.49999... inclusive as there are between 0.5 and 0.99999... inclusive, | so the habit of rounding .5 down half of the time means rounding down | more often than rounding up. Finite precision arithmetic may either | mitigate or exacerbate that; I don't know. But this subject has to do | with open vs closed intervals on the real number line. The interval [0, | .5) is the same size as the interval [.5, 1) (though it's been so long | I might have the symbols reversed), and that [.5 means include .5, | whereas .5) means don't include it. I don't know whether this is a useful way to see it, but it does show that round-up is a better solution under the stated premises. the question is whether those premises are optimal. I don't think so. instead of looking at the size of the ranges [0,.5) and [.5,1), we should look at the range of numbers that round to a given integer. e.g., the numbers that round to zero are in the range [-.5,+.5). this range is slightly off balance, and it is this imbalance that accumulates errors. in a round-to-even scheme, the numbers that round to an even integer n are in the range [n-.5,n+.5], which balances perfectly. the numbers that round to an odd integer n is in the range (n-.5,n+.5), which also balances. this balance yields correct results. #<Erik> -- sufficiently advanced political correctness is indistinguishable from irony