From: Richard B. Kreckel Date: Wed, 2 Nov 2011 18:43:26 +0000 (+0000) Subject: re PR libstdc++/50880 (__complex_acosh() picks wrong complex branch) X-Git-Tag: upstream/12.2.0~80209 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=af7c185869e5c5f1535127dd138db51eb5c3b932;p=platform%2Fupstream%2Fgcc.git re PR libstdc++/50880 (__complex_acosh() picks wrong complex branch) 2011-11-02 Richard B. Kreckel Paolo Carlini PR libstdc++/50880 * include/std/complex (__complex_acosh): Fix in a better way, use Kahan's formula. * include/tr1/complex (__complex_acosh): Likewise. From-SVN: r180787 --- diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex index 3c41b48..d742343 100644 --- a/libstdc++-v3/include/std/complex +++ b/libstdc++-v3/include/std/complex @@ -1686,14 +1686,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION std::complex<_Tp> __complex_acosh(const std::complex<_Tp>& __z) { - std::complex<_Tp> __t((__z.real() - __z.imag()) - * (__z.real() + __z.imag()) - _Tp(1.0), - _Tp(2.0) * __z.real() * __z.imag()); - __t = std::sqrt(__t); - if (__z.real() < _Tp()) - __t = -__t; - - return std::log(__t + __z); + // Kahan's formula. + return _Tp(2.0) * std::log(std::sqrt(_Tp(0.5) * (__z + _Tp(1.0))) + + std::sqrt(_Tp(0.5) * (__z - _Tp(1.0)))); } #if _GLIBCXX_USE_C99_COMPLEX_TR1 diff --git a/libstdc++-v3/include/tr1/complex b/libstdc++-v3/include/tr1/complex index d831eeb..689ea16 100644 --- a/libstdc++-v3/include/tr1/complex +++ b/libstdc++-v3/include/tr1/complex @@ -185,14 +185,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION std::complex<_Tp> __complex_acosh(const std::complex<_Tp>& __z) { - std::complex<_Tp> __t((__z.real() - __z.imag()) - * (__z.real() + __z.imag()) - _Tp(1.0), - _Tp(2.0) * __z.real() * __z.imag()); - __t = std::sqrt(__t); - if (__z.real() < _Tp()) - __t = -__t; - - return std::log(__t + __z); + // Kahan's formula. + return _Tp(2.0) * std::log(std::sqrt(_Tp(0.5) * (__z + _Tp(1.0))) + + std::sqrt(_Tp(0.5) * (__z - _Tp(1.0)))); } #if _GLIBCXX_USE_C99_COMPLEX_TR1