logfloat-0.13.2: Log-domain floating point numbers

CopyrightCopyright (c) 2007--2015 wren gayle romano
Portabilitysemi-portable (CPP, MPTC, OverlappingInstances)
Safe HaskellNone



This module presents a type class for generic conversion between numeric types, generalizing realToFrac in order to overcome problems with pivoting through Rational



class (Real a, Fractional b) => RealToFrac a b where Source

The realToFrac function is defined to pivot through a Rational according to the haskell98 spec. This is non-portable and problematic as discussed in Data.Number.Transfinite. Since there is resistance to breaking from the spec, this class defines a reasonable variant which deals with transfinite values appropriately.

There is a generic instance from any Transfinite Real to any Transfinite Fractional, using checks to ensure correctness. GHC has specialized versions for some types which use primitive converters instead, for large performance gains. (These definitions are hidden from other compilers via CPP.) Due to a bug in Haddock the specialized instances are shown twice and the generic instance isn't shown at all. Since the instances are overlapped, you'll need to give type signatures if the arguments to realToFrac are polymorphic. There's also a generic instance for any Real Fractional type to itself, thus if you write any generic instances beware of incoherence.

If any of these restrictions (CPP, GHC-only optimizations, OverlappingInstances) are onerous to you, contact the maintainer (we like patches). Note that this does work for Hugs with suitable options (e.g. hugs -98 +o -F'cpp -P'). However, Hugs doesn't allow IncoherentInstances nor does it allow diamonds with OverlappingInstances, which restricts the ability to add additional generic instances.


realToFrac :: a -> b Source