RFC: Fixing floating point conversions.
nbowler at elliptictech.com
Thu Feb 25 11:59:05 EST 2010
On 17:30 Thu 25 Feb , Christian Maeder wrote:
> Nick Bowler schrieb:
> > *** Idea #2 ***
> > Similar to #1, except using a "generic" type instead of Double.
> > Define a new type, call it FloatConvert, which represents "rational plus
> > other values". Something along the lines of:
> > data FloatConvert
> > = FCZero Bool -- Signed zero
> > | FCInfinity Bool -- Signed infinity
> > | FCNaN Integer -- Generic NaN
> > | FCFinite Rational -- Finite, non-zero value
> interesting. What is the Integer in FCNaN for?
Many floating point formats have multiple NaNs. In the IEEE 754 binary
formats, a NaN is specified by a maximum exponent and *any* non-zero
significand. The extra bits are sometimes used for diagnostic
information. There are signaling and quiet NaNs, and they have a sign
bit. IEEE 754 recommends that operations involving NaNs preserve as
much of this information as possible.
I chose Integer since it can encode all of this information. It is
desirable for conversions from a type to itself to be the identity
function, even in the presence of multiple NaNs. I'm sure many other
encodings are workable.
> > * While the free-form encoding of NaN values will allow conversion
> > from a type to itself to be the identity function, it may make
> > it tricky to perform the "ideal" conversion between different
> > types.
> I don't understand this last point about "free-form encoding of NaN"
It's free-form in that, as I specified it, it's up to the particular
RealFloat instance to decide how the Integer is used. This might make
conversions which preserve, say, signaling NaNs trickier to implement.
> I would come up with a data type like:
> data ExtNum a
> = NegativeZero
> | NaN
> | Infinity Bool
> | Num a
> add instances for the classes, Eq, Ord, Num, ....
> (depending on "a" that must be at least from the class Num for "0")
> and use "ExtNum Rational" for floating point conversions.
Nick Bowler, Elliptic Technologies (http://www.elliptictech.com/)
More information about the Haskell-prime