
On 14:30 Fri 05 Mar , Achim Schneider wrote:
Nick Bowler
wrote: I meant to say that "fromRational . toRational" is not appropriate for converting values from one floating point type to another floating point type.
It gets even worse: My GPU doesn't know about doubles and its floats aren't IEEE, at all (not that Haskell Doubles are guaranteed to be IEEE iirc)
AFAIK, GLDouble is a newtype wrapper around CDouble, though, and doesn't correspond to a GPU-internal type. Even if it did, if we are converting to a type that doesn't support infinities, then is is reasonable for the conversion to not support them, either. I'd want to see a call to error in this case, but perhaps allowing "unsafe" optimisations (see below).
I think the situation calls for a split interface: One to satisfy the numericists / scientific IEEE users, and one to satisfy performance.
I think this is a job for the compiler rather than the interface. For example, GCC has -ffinite-math-only, -fno-signed-zeros, etc., which allow the compiler to make assumptions about the program that would not normally be valid. Nevertheless, for the issue at hand (Double<=>CDouble<=>GLDouble), there is a conversion interface that should satisfy everyone (both fast and correct): the one that compiles to nothing at all. -- Nick Bowler, Elliptic Technologies (http://www.elliptictech.com/)