Opened 11 years ago

Closed 11 years ago

Last modified 9 years ago

#1239 closed proposal (wontfix)

compare on exceptional Doubles and Floats should raise an error

Reported by: igloo Owned by:
Priority: normal Milestone:
Component: libraries/base Version: 6.6
Keywords: Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:



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 reason.

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 Flaots) 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.

Change History (3)

comment:1 Changed 11 years ago by igloo

Resolution: wontfix
Status: newclosed

comment:2 Changed 9 years ago by simonmar

Architecture: UnknownUnknown/Multiple

comment:3 Changed 9 years ago by simonmar

Operating System: UnknownUnknown/Multiple
Note: See TracTickets for help on using tickets.