I think that `*', `/', `lcm', `expt, and `exp' are the only operations that produce an exact result when given some inexact arguments. The `exp' and `expt' cases were documented before, and I've clarified the rest in the docs.
The docs now also note that `sin', `tan', `asin', and `atan' produce an exact 0 when given an exact 0. Finally, the `atan' procedure now returns an exact 0 when it is given two arguments, the first is an exact 0, and the second is an exact positive number. Why all the special cases? If I remember correctly, it makes complex-number calculations work more naturally when you have an exact zero as a real or imaginary part. In any case, after spending some time on this at one point, I concluded that the special cases are worthwhile (and that imitating Gambit in this area is a good rule of thumb). At Fri, 11 Jun 2010 16:28:35 -0400, Sam Tobin-Hochstadt wrote: > Currently, when given inputs some of which are floats, `*', `+', '/' > and `-' almost always produce floats. However, there are some cases > where this is not true: > > (* flt 0) > (/ 0 flt) > > Unfortunately, this makes the job of the typechecker and optimizer > harder (since * and / don't have the closure properties you'd want). > It's also not fully documented. Here's the quote from the > documentation: > > "Certain operations on inexact numbers, however, produce an exact > number, such as multiplying an inexact number with an exact 0." > > I'd like it if these were changed to always produce floats, but I'd > settle for complete documentation so that I can give everything the > right type. > -- > sam th > samth at ccs.neu.edu > _________________________________________________ > For list-related administrative tasks: > http://lists.racket-lang.org/listinfo/dev