diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | math/libm-test.inc | 6 | ||||
-rw-r--r-- | sysdeps/generic/s_csqrt.c | 6 | ||||
-rw-r--r-- | sysdeps/generic/s_csqrtf.c | 6 | ||||
-rw-r--r-- | sysdeps/generic/s_csqrtl.c | 6 |
5 files changed, 22 insertions, 10 deletions
@@ -1,5 +1,13 @@ 2005-10-13 Ulrich Drepper <drepper@redhat.com> + [BZ #1466] + * sysdeps/generic/s_csqrt.c (__csqrt): For zero real part, return + principal square root. + * sysdeps/generic/s_csqrtf.c (__csqrtf): Likewise. + * sysdeps/generic/s_csqrtl.c (__csqrtl): Likewise. + * math/libm-test.inc (csqrt_test): Add test for returning + principal value. + * include/features.h: Define _POSIX_C_SOURCE to 200112 for _XOPEN_SOURCE == 600. diff --git a/math/libm-test.inc b/math/libm-test.inc index be05222629..15509019c9 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -1,4 +1,4 @@ -/* Copyright (C) 1997-2002, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 1997-2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger <aj@suse.de>, 1997. @@ -153,6 +153,7 @@ #define M_PI2_LOG10El M_PI_2l * M_LOG10El #define M_PI4_LOG10El M_PI_4l * M_LOG10El #define M_PI_LOG10El M_PIl * M_LOG10El +#define M_SQRT_2_2 0.70710678118654752440084436210484903L /* sqrt (2) / 2 */ static FILE *ulps_file; /* File to document difference. */ static int output_ulps; /* Should ulps printed? */ @@ -2212,6 +2213,9 @@ csqrt_test (void) TEST_c_c (csqrt, 0.75L, 1.25L, 1.05065169626078392338656675760808326L, 0.594868882070379067881984030639932657L); TEST_c_c (csqrt, -2, -3, 0.89597747612983812471573375529004348L, -1.6741492280355400404480393008490519L); TEST_c_c (csqrt, -2, 3, 0.89597747612983812471573375529004348L, 1.6741492280355400404480393008490519L); + /* Principal square root should be returned (i.e., non-negative real + part). */ + TEST_c_c (csqrt, 0, -1, M_SQRT_2_2, -M_SQRT_2_2); END (csqrt, complex); } diff --git a/sysdeps/generic/s_csqrt.c b/sysdeps/generic/s_csqrt.c index 0bb6690b17..04ed410a16 100644 --- a/sysdeps/generic/s_csqrt.c +++ b/sysdeps/generic/s_csqrt.c @@ -1,5 +1,5 @@ /* Complex square root of double value. - Copyright (C) 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Based on an algorithm by Stephen L. Moshier <moshier@world.std.com>. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -79,8 +79,8 @@ __csqrt (__complex__ double x) { double r = __ieee754_sqrt (0.5 * fabs (__imag__ x)); - __real__ res = __copysign (r, __imag__ x); - __imag__ res = r; + __real__ res = r; + __imag__ res = __copysign (r, __imag__ x); } else { diff --git a/sysdeps/generic/s_csqrtf.c b/sysdeps/generic/s_csqrtf.c index b02c605a37..2fba69ce1b 100644 --- a/sysdeps/generic/s_csqrtf.c +++ b/sysdeps/generic/s_csqrtf.c @@ -1,5 +1,5 @@ /* Complex square root of float value. - Copyright (C) 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Based on an algorithm by Stephen L. Moshier <moshier@world.std.com>. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -79,8 +79,8 @@ __csqrtf (__complex__ float x) { float r = __ieee754_sqrtf (0.5 * fabsf (__imag__ x)); - __real__ res = __copysignf (r, __imag__ x); - __imag__ res = r; + __real__ res = r; + __imag__ res = __copysignf (r, __imag__ x); } else { diff --git a/sysdeps/generic/s_csqrtl.c b/sysdeps/generic/s_csqrtl.c index 8e27750a04..9d00946c51 100644 --- a/sysdeps/generic/s_csqrtl.c +++ b/sysdeps/generic/s_csqrtl.c @@ -1,5 +1,5 @@ /* Complex square root of long double value. - Copyright (C) 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Based on an algorithm by Stephen L. Moshier <moshier@world.std.com>. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -79,8 +79,8 @@ __csqrtl (__complex__ long double x) { long double r = __ieee754_sqrtl (0.5 * fabsl (__imag__ x)); - __real__ res = __copysignl (r, __imag__ x); - __imag__ res = r; + __real__ res = r; + __imag__ res = __copysignl (r, __imag__ x); } else { |