compare on Double

Ian Lynagh igloo at
Tue Mar 20 11:22:20 EDT 2007

Hi all,



    let n = 0/0 :: Double in (n `compare` n, n < n, n == n, n > n)

In GHC and YHC this gives


while in hugs it gives


Neither of these is very satisfactory, as I would expect

    x `compare` y === EQ   =>   (x == y) === True
    x `compare` y === GT   =>   (x > y) === True

and it's even less pleasant that the implementations differ for no good

The Haskell report isn't very helpful on how comparing exceptional
Doubles should behave, as it doesn't even say you need to have NaN etc:
    The results of exceptional conditions (such as overflow or
    underflow) on the fixed-precision numeric types are undefined; an
    implementation may choose error (_|_, semantically), a truncated
    value, or a special value such as infinity, indefinite, etc.

I think that the right answer is that
    n `compare` n
above (and more generally such a comparison for any incomparable Doubles
or Floats) should raise an error (i.e. be _|_).

The changes needed are simple, e.g. for GHC

    (D# x) `compare` (D# y) | x <## y   = LT
                            | x ==## y  = EQ
                            | otherwise = GT


    (D# x) `compare` (D# y) | x <## y   = LT
                            | x ==## y  = EQ
                            | x >## y   = GT
                            | otherwise = error "Incomparable values"

Deadline: 1 week after discussion ends. 


More information about the Libraries mailing list