[racket-dev] (round), etc. in Typed Racket

From: Vincent St-Amour (stamourv at ccs.neu.edu)
Date: Sat Dec 11 20:52:40 EST 2010

At Sat, 11 Dec 2010 18:35:17 -0700,
Petey Aldous wrote:
> I've discovered what may be a bug in the type system of Typed Racket. The
> functions that round - (round), (truncate), (ceiling), etc. are typed as
> Real, not Integer; however, the result of (integer? (round (* 10e15
> (random)))) is consistently true - and the same holds for the other rounding
> functions.

Typed Racket's Integer type corresponds to racket's exact integers
(exact-integer?, not integer?).

integer? can return true for floating point numbers:
(integer? 1.0) -> #t
but exact-integer? cannot.

The types for round, truncate, etc. take this into account. For
instance, if you round an exact rational, the type of the result will
be Integer, whereas if you round a floating point number, you get a
Float back.

> Is this intentional? If so, why? If it is (or even if it isn't), how can I
> transform the result of (random) to an Integer?

You can use inexact->exact on the result of round.


Posted on the dev mailing list.