Hi Brad, First of all, I would advocate modulo, not quotient. Then at least it also works correctly for negative integers.
Secondly, I see the code out of context, but variable names like "weight" and "volume" to me suggest that they may be arbitrary (non-negative) real numbers. And then modulo doesn't work. So for posterity, if you know a and b are integers: replace (floor (/ a b)) with (modulo a b) replace (truncate (/ a b)) with (quotient a b) 2013/6/10 Bradley Lucier <luc...@math.purdue.edu> > Re: > >> FWIW, I would have at least written: >> >> ((qty (in-range 0 (add1 (min (floor (/ weight-left weight)) >> (floor (/ volume-left volume))))))) >> > > I have now seen the > > (floor (/ a b)) > > idiom a number of times, and wonder why people prefer it to > > (quotient a b) > > Normally, to calculate (/ a b) where a and b are exact integers requires > one to calculate (gcd a b) to put the fraction into lowest terms > p/q=(quotient a (gcd a b))/(quotient b (gcd a b)); then, to calculate > (floor p/q), one must calculate (quotient p q). > > For large integers of size $N$ bits, (gcd a b) takes $O(N\log^2(N))$ > fixnum operations, where quotient takes $O(N\log N)$ operations. This > assumes Fourier-based methods for bignum multiplication; for more direct > methods, the difference in operation count is larger. > > In any case, the (floor (/ ...)) idiom takes noticeably more time than > (quotient ...). If one knows that a and b are positive integers, they give > the same results. > > This is an argument not to use (floor (/ ...)). Are there arguments in > favor of this idiom? > > Brad > ____________________ > Racket Users list: > http://lists.racket-lang.org/**users <http://lists.racket-lang.org/users> >
____________________ Racket Users list: http://lists.racket-lang.org/users