
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/)