[racket] No, no, silly rabbit, Single-Flonum is for kids

From: Neil Toronto (neil.toronto at gmail.com)
Date: Sun Sep 23 04:31:19 EDT 2012

On 09/23/2012 05:40 PM, John Clements wrote:
> I'm trying to convert a list of Reals into a list of Floats, and the natural choice is (map exact->inexact l).  Unfortunately, it appears that exact->inexact produces Inexact-Reals, not flonums. Taking a look at the type expansions, I see that the difference is that Inexact-Real includes *single-*flonums. I'm guessing--and this is just a guess--that the only situation where exact->inexact will produce single-flonums is when it's *given* a single-flonum.
>
> If I'm right, then it's safe for me to stick in a predicate that detects and fails on results that aren't flonums. If I'm wrong, then exact->inexact might spit out a single-flonum when given, say, 19. That would be a problem. Is my conjecture correct?
>
> I would suggest some kind of change to TR here, but honestly I can see that fixing this would probably be a big pain.

You're right that `exact->inexact' only returns a single flonum when 
given one. Use `real->double-flonum' instead.

(Yes, its verbosity is ridiculous. I got tired of it and reexported it 
as `fl' from `math/flonum'. I can write (flsqrt (+ (fl a) (fl b))), for 
example. It's nice.)

If there's a user-interface problem here, it's that Racket has two kinds 
of inexact numbers. TR is just forcing you to deal with that reality so 
it can guarantee your program won't crash.

Neil ⊥


Posted on the users mailing list.