From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2479 invoked by alias); 9 Mar 2008 14:22:38 -0000 Received: (qmail 2462 invoked by uid 22791); 9 Mar 2008 14:22:37 -0000 X-Spam-Check-By: sourceware.org Received: from mail.suse.de (HELO mx1.suse.de) (195.135.220.2) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sun, 09 Mar 2008 14:22:18 +0000 Received: from Relay1.suse.de (mail2.suse.de [195.135.221.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 2B71F349AA for ; Sun, 9 Mar 2008 15:22:15 +0100 (CET) From: Andreas Jaeger To: libc-hacker@sources.redhat.com Subject: BZ 5857: Fix rint/nearbyint OpenPGP: id=C272A126; url=http://www.suse.de/~aj/keys.txt Date: Sun, 09 Mar 2008 14:22:00 -0000 Message-ID: <878x0skmel.fsf@suse.de> User-Agent: Gnus/5.110007 (No Gnus v0.7) Emacs/22.1 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha1; protocol="application/pgp-signature" Mailing-List: contact libc-hacker-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sourceware.org X-SW-Source: 2008-03/txt/msg00004.txt.bz2 --=-=-= Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 3629 rint and nearbyint gave in some cases wrong values. Ok to commit? A patch for ldbl-* might be needed as well - anybody interested to look at it? Andreas 2008-03-09 Andreas Jaeger [BZ #5857] * sysdeps/ieee754/dbl-64/s_rint.c (__rint): Handle j0=3D=3D18. * sysdeps/ieee754/dbl-64/s_nearbyint.c (__nearbyint): Likewise. Patch by Mark Elliott . * math/libm-test.inc (nearbyint_test): Add new test cases from #5857. (rint_test): Likewise. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Index: sysdeps/ieee754/dbl-64/s_rint.c --- sysdeps/ieee754/dbl-64/s_rint.c 13 Jul 1999 23:53:26 -0000 1.1 +++ sysdeps/ieee754/dbl-64/s_rint.c 9 Mar 2008 14:20:59 -0000 @@ -67,8 +67,11 @@ TWO52[2]=3D{ if(((i0&i)|i1)=3D=3D0) return x; /* x is integral */ i>>=3D1; if(((i0&i)|i1)!=3D0) { - if(j0=3D=3D19) i1 =3D 0x40000000; else - i0 =3D (i0&(~i))|((0x20000)>>j0); + if(j0=3D=3D19) i1 =3D 0x40000000; else if (j0<18) + i0 =3D (i0&(~i))|((0x20000)>>j0); else { + i0 &=3D ~i; + i1 =3D 0x80000000; + } } } } else if (j0>51) { =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Index: sysdeps/ieee754/dbl-64/s_nearbyint.c --- sysdeps/ieee754/dbl-64/s_nearbyint.c 13 Jul 1999 23:53:03 -0000 1.1 +++ sysdeps/ieee754/dbl-64/s_nearbyint.c 9 Mar 2008 14:21:00 -0000 @@ -71,8 +71,11 @@ TWO52[2]=3D{ if(((i0&i)|i1)=3D=3D0) return x; /* x is integral */ i>>=3D1; if(((i0&i)|i1)!=3D0) { - if(j0=3D=3D19) i1 =3D 0x40000000; else - i0 =3D (i0&(~i))|((0x20000)>>j0); + if(j0=3D=3D19) i1 =3D 0x40000000; else if (j0<18) + i0 =3D (i0&(~i))|((0x20000)>>j0); else { + i0 &=3D ~i; + i1 =3D 0x80000000; + } } } } else if (j0>51) { =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Index: math/libm-test.inc --- math/libm-test.inc 28 Oct 2007 01:14:25 -0000 1.77 +++ math/libm-test.inc 9 Mar 2008 14:21:00 -0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 1997-2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1997-2006, 2007, 2008 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger , 1997. =20 @@ -4481,6 +4481,11 @@ nearbyint_test (void) TEST_f_f (nearbyint, -0.5, minus_zero); TEST_f_f (nearbyint, -1.5, -2.0); =20 + TEST_f_f (nearbyint, 262144.75, 262145.0); + TEST_f_f (nearbyint, 262142.75, 262143.0); + TEST_f_f (nearbyint, 524286.75, 524287.0); + TEST_f_f (nearbyint, 524288.75, 524289.0); + END (nearbyint); } =20 @@ -4852,6 +4857,10 @@ rint_test (void) TEST_f_f (rint, -0.1, -0.0); TEST_f_f (rint, -0.25, -0.0); TEST_f_f (rint, -0.625, -1.0); + TEST_f_f (rint, 262144.75, 262145.0); + TEST_f_f (rint, 262142.75, 262143.0); + TEST_f_f (rint, 524286.75, 524287.0); + TEST_f_f (rint, 524288.75, 524289.0); #ifdef TEST_LDOUBLE /* The result can only be represented in long double. */ TEST_f_f (rint, 4503599627370495.5L, 4503599627370496.0L); --=20 Andreas Jaeger, Director Platform / openSUSE, aj@suse.de SUSE LINUX Products GmbH, GF: Markus Rex, HRB 16746 (AG N=FCrnberg) Maxfeldstr. 5, 90409 N=FCrnberg, Germany GPG fingerprint =3D 93A3 365E CE47 B889 DF7F FED1 389A 563C C272 A126 --=-=-= Content-Type: application/pgp-signature Content-length: 193 -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) iD8DBQFH0/KVOJpWPMJyoSYRAjOTAJ99vxHZomyqK8wV7+iav21eZhF+/QCePeFy u/qEkgirQwmdtyFKAz+XE6Y= =nZgs -----END PGP SIGNATURE----- --=-=-=--