Fix cproj implmentation.

This commit is contained in:
Ulrich Drepper 2010-04-08 15:32:51 -07:00
parent 5e4295fb58
commit 88e236a627
6 changed files with 33 additions and 51 deletions

View File

@ -1,3 +1,13 @@
2010-04-08 Andreas Jaeger <aj@suse.de>
[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.
2010-04-07 Ulrich Drepper <drepper@redhat.com>
* posix/bug-getopt1.c: New file.

View File

@ -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 <aj@suse.de>, 1997.
@ -2087,7 +2087,7 @@ cproj_test (void)
TEST_c_c (cproj, minus_infty, minus_infty, plus_infty, minus_zero);
TEST_c_c (cproj, 1.0, 0.0, 1.0, 0.0);
TEST_c_c (cproj, 2.0, 3.0, 0.2857142857142857142857142857142857L, 0.42857142857142857142857142857142855L);
TEST_c_c (cproj, 2.0, 3.0, 2.0, 3.0);
END (cproj, complex);
}

View File

@ -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 <drepper@cygnus.com>, 1997.
@ -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 = INFINITY;
__imag__ res = __copysign (0.0, __imag__ x);
}
else
{
double den = __real__ x * __real__ x + __imag__ x * __imag__ x + 1.0;
__real__ res = (2.0 * __real__ x) / den;
__imag__ res = (2.0 * __imag__ x) / den;
return res;
}
return res;
return x;
}
weak_alias (__cproj, cproj)
#ifdef NO_LONG_DOUBLE

View File

@ -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 <drepper@cygnus.com>, 1997.
@ -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 = INFINITY;
__imag__ res = __copysignf (0.0, __imag__ x);
}
else
{
float den = __real__ x * __real__ x + __imag__ x * __imag__ x + 1.0;
__real__ res = (2.0 * __real__ x) / den;
__imag__ res = (2.0 * __imag__ x) / den;
return res;
}
return res;
return x;
}
#ifndef __cprojf
weak_alias (__cprojf, cprojf)

View File

@ -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 <drepper@cygnus.com>, 1997.
@ -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 = INFINITY;
__imag__ res = __copysignl (0.0, __imag__ x);
}
else
{
long double den = (__real__ x * __real__ x + __imag__ x * __imag__ x
+ 1.0);
__real__ res = (2.0 * __real__ x) / den;
__imag__ res = (2.0 * __imag__ x) / den;
return res;
}
return res;
return x;
}
weak_alias (__cprojl, cprojl)

View File

@ -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 <drepper@cygnus.com>, 1997.
@ -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 = INFINITY;
__imag__ res = __copysignl (0.0, __imag__ x);
}
else
{
long double den = (__real__ x * __real__ x + __imag__ x * __imag__ x
+ 1.0);
__real__ res = (2.0 * __real__ x) / den;
__imag__ res = (2.0 * __imag__ x) / den;
/* __gcc_qmul does not respect -0.0 so we need the following fixup. */
if (__real__ x == 0.0)
__real__ res = __real__ x;
if (__imag__ x == 0.0)
__imag__ res = __imag__ x;
return res;
}
return res;
return x;
}
long_double_symbol (libm, __cprojl, cprojl);