From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10787 invoked by alias); 8 Apr 2010 10:47:58 -0000 Received: (qmail 10771 invoked by uid 22791); 8 Apr 2010 10:47:58 -0000 X-SWARE-Spam-Status: No, hits=-6.8 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_HI,TW_OJ,TW_QM,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from cantor.suse.de (HELO mx1.suse.de) (195.135.220.2) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 08 Apr 2010 10:47:27 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 3EC7F93A00 for ; Thu, 8 Apr 2010 12:47:25 +0200 (CEST) From: Andreas Jaeger To: libc-hacker@sources.redhat.com Subject: Fix for BZ#10401: cproj broken Date: Thu, 08 Apr 2010 10:47:00 -0000 User-Agent: KMail/1.13.2 (Linux/2.6.34-rc2-git3-0.0.19.80160e7-desktop; KDE/4.4.2; x86_64; ; ) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1364578.VdriulDYYj"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201004081247.24495.aj@suse.de> 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: 2010-04/txt/msg00003.txt.bz2 --nextPart1364578.VdriulDYYj Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-length: 6303 Here's a fix for cproj, it is implemented the wrong way, Andreas 2010-04-08 Andreas Jaeger [BZ #10401] * math/s_cprojl.c (__cprojl): Fix implementation to follow C99 standard. * math/s_cprojf.c (__cprojf): Likewise. * math/s_cproj.c (__cproj): Likewise. * sysdeps/ieee754/ldbl-128ibm/s_cprojl.c (__cprojl): Likewise. * math/libm-test.inc (cproj_test): Fix test. diff --git a/math/libm-test.inc b/math/libm-test.inc index 260d3ec..6650b88 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -1,4 +1,4 @@ -/* Copyright (C) 1997-2006, 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1997-2006, 2007, 2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger , 1997. =20 @@ -2087,7 +2087,7 @@ cproj_test (void) TEST_c_c (cproj, minus_infty, minus_infty, plus_infty, minus_zero); =20 TEST_c_c (cproj, 1.0, 0.0, 1.0, 0.0); - TEST_c_c (cproj, 2.0, 3.0, 0.2857142857142857142857142857142857L, 0.4285= 7142857142857142857142857142855L); + TEST_c_c (cproj, 2.0, 3.0, 2.0, 3.0); =20 END (cproj, complex); } diff --git a/math/s_cproj.c b/math/s_cproj.c index 8e7ca41..90e5eba 100644 --- a/math/s_cproj.c +++ b/math/s_cproj.c @@ -1,5 +1,5 @@ /* Compute projection of complex double value to Riemann sphere. - Copyright (C) 1997, 1999 Free Software Foundation, Inc. + Copyright (C) 1997, 1999, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. =20 @@ -25,24 +25,19 @@ __complex__ double __cproj (__complex__ double x) { - __complex__ double res; - if (isnan (__real__ x) && isnan (__imag__ x)) return x; else if (!isfinite (__real__ x) || !isfinite (__imag__ x)) { + __complex__ double res; + __real__ res =3D INFINITY; __imag__ res =3D __copysign (0.0, __imag__ x); - } - else - { - double den =3D __real__ x * __real__ x + __imag__ x * __imag__ x + 1= .0; - - __real__ res =3D (2.0 * __real__ x) / den; - __imag__ res =3D (2.0 * __imag__ x) / den; +=20=20=20=20=20=20 + return res; } =20 - return res; + return x; } weak_alias (__cproj, cproj) #ifdef NO_LONG_DOUBLE diff --git a/math/s_cprojf.c b/math/s_cprojf.c index 83df13c..e7eacaf 100644 --- a/math/s_cprojf.c +++ b/math/s_cprojf.c @@ -1,5 +1,5 @@ /* Compute projection of complex float value to Riemann sphere. - Copyright (C) 1997, 1999 Free Software Foundation, Inc. + Copyright (C) 1997, 1999, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. =20 @@ -25,24 +25,19 @@ __complex__ float __cprojf (__complex__ float x) { - __complex__ float res; - if (isnan (__real__ x) && isnan (__imag__ x)) return x; else if (!isfinite (__real__ x) || !isfinite (__imag__ x)) { + __complex__ float res; + __real__ res =3D INFINITY; __imag__ res =3D __copysignf (0.0, __imag__ x); - } - else - { - float den =3D __real__ x * __real__ x + __imag__ x * __imag__ x + 1.= 0; =20 - __real__ res =3D (2.0 * __real__ x) / den; - __imag__ res =3D (2.0 * __imag__ x) / den; + return res; } =20 - return res; + return x; } #ifndef __cprojf weak_alias (__cprojf, cprojf) diff --git a/math/s_cprojl.c b/math/s_cprojl.c index c70cdc4..19c17a8 100644 --- a/math/s_cprojl.c +++ b/math/s_cprojl.c @@ -1,5 +1,5 @@ /* Compute projection of complex long double value to Riemann sphere. - Copyright (C) 1997, 1999 Free Software Foundation, Inc. + Copyright (C) 1997, 1999, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. =20 @@ -25,24 +25,18 @@ __complex__ long double __cprojl (__complex__ long double x) { - __complex__ long double res; - if (isnan (__real__ x) && isnan (__imag__ x)) return x; else if (!isfinite (__real__ x) || !isfinite (__imag__ x)) { + __complex__ long double res; + __real__ res =3D INFINITY; __imag__ res =3D __copysignl (0.0, __imag__ x); - } - else - { - long double den =3D (__real__ x * __real__ x + __imag__ x * __imag__= x - + 1.0); =20 - __real__ res =3D (2.0 * __real__ x) / den; - __imag__ res =3D (2.0 * __imag__ x) / den; + return res; } =20 - return res; + return x; } weak_alias (__cprojl, cprojl) diff --git a/sysdeps/ieee754/ldbl-128ibm/s_cprojl.c b/sysdeps/ieee754/ldbl-= 128ibm/s_cprojl.c index 2167db3..b2a09ae 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_cprojl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_cprojl.c @@ -1,5 +1,5 @@ /* Compute projection of complex long double value to Riemann sphere. - Copyright (C) 1997,1999,2006 Free Software Foundation, Inc. + Copyright (C) 1997,1999,2006,2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. =20 @@ -25,30 +25,18 @@ __complex__ long double __cprojl (__complex__ long double x) { - __complex__ long double res; - if (isnan (__real__ x) && isnan (__imag__ x)) return x; else if (!isfinite (__real__ x) || !isfinite (__imag__ x)) { + __complex__ long double res; + __real__ res =3D INFINITY; __imag__ res =3D __copysignl (0.0, __imag__ x); - } - else - { - long double den =3D (__real__ x * __real__ x + __imag__ x * __imag__= x - + 1.0); - - __real__ res =3D (2.0 * __real__ x) / den; - __imag__ res =3D (2.0 * __imag__ x) / den; - /* __gcc_qmul does not respect -0.0 so we need the following fixup. = */ - if (__real__ x =3D=3D 0.0) - __real__ res =3D __real__ x; =20 - if (__imag__ x =3D=3D 0.0) - __imag__ res =3D __imag__ x; + return res; } =20 - return res; + return x; } long_double_symbol (libm, __cprojl, cprojl); --=20 Andreas Jaeger, Program Manager openSUSE, aj@{novell.com,opensuse.org} Twitter: jaegerandi | Identica: jaegerandi 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 --nextPart1364578.VdriulDYYj Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. Content-length: 190 -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iD8DBQBLvbQ8OJpWPMJyoSYRAjuTAJsEjS9Ruy8XFkDFoVLqP/0DCAQcJgCfXI8M bkZf1FC+CrxXs9/imMbJd9I= =EpTu -----END PGP SIGNATURE----- --nextPart1364578.VdriulDYYj--