More on integer division
Dylan Thurston
dpt@math.harvard.edu
Sat, 29 Jun 2002 12:23:27 -0400
--DocE+STaALJfprDB
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
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 =3D=3D -(5`div`2) =3D=3D -2
> > but (-5)`div`2 =3D=3D -3
> >=20
> > Ghc 5.02.2 has the infix priority wrong, and interprets the former as t=
he latter.
> > But more bizarrely, ghc 5.02.2 gets this very wrong:
> >=20
> > Prelude> (-1796254192) `div` 357566600
> > 5
>=20
> 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: hugs-bugs@haskell.org
|| || 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)
-----
--DocE+STaALJfprDB
Content-Type: application/pgp-signature
Content-Disposition: inline
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.7 (GNU/Linux)
iD8DBQE9Hd7+Veybfhaa3tcRAi4KAJ93NOcEnx5CDdwNSMqdJtXRBA+vfwCeKNDN
Nlv1xbArDIqnpaNCV3FWJWo=
=qQ7j
-----END PGP SIGNATURE-----
--DocE+STaALJfprDB--