On Fri, Jun 28, 2002 at 03:54:50PM -0400, Dylan Thurston wrote: > On Fri, Jun 28, 2002 at 10:24:13AM +0100, Malcolm Wallace wrote: > > Yes, -5`div`2 == -(5`div`2) == -2 > > but (-5)`div`2 == -3 > > > > Ghc 5.02.2 has the infix priority wrong, and interprets the former as the latter. > > But more bizarrely, ghc 5.02.2 gets this very wrong: > > > > Prelude> (-1796254192) `div` 357566600 > > 5 > > Thanks for the clear summary.
After a looking a little more, there seem to be other problems (including errors in my proposed solution). I don't know where the code for quotRem is, but it is also buggy. For instance, Prelude> 9 `quotRem` (-5) (-1,4) (The correct answer is (-1,-4).) I'm frankly astonished: has noone used these functions with negative arguments before? This happens with both ghci and compiled programs, both -fvia-C and -fasm. Hugs (see below) and nhc make the same error in this case. There seems to be too strong a reliance on C's operators '/' and '%', which give these results (with gcc on x86). This may be a bug in gcc. I'm using gcc 2.95.4; I'm not sure which version compiled the Debian packages I'm using. According to http://home.tiscalinet.ch/t_wolf/tw/c/c9x_changes.html#Semantics, the C9x standard specifies that division should truncate towards 0; I believe that earlier it was undefined. I'm shocked that non of the three Haskell implementations had a test suite that caught this problem. ----- __ __ __ __ ____ ___ _________________________________________ || || || || || || ||__ Hugs 98: Based on the Haskell 98 standard ||___|| ||__|| ||__|| __|| Copyright (c) 1994-2001 ||---|| ___|| World Wide Web: http://haskell.org/hugs || || Report bugs to: [EMAIL PROTECTED] || || Version: February 2001 _________________________________________ Haskell 98 mode: Restart with command line option -98 to enable extensions Reading file "/usr/share/hugs98/lib/Prelude.hs": Hugs session for: /usr/share/hugs98/lib/Prelude.hs Type :? for help Prelude> 9 `quotRem` (-5) (-1,4) -----
msg04901/pgp00000.pgp
Description: PGP signature
