epoc32/include/stdapis/boost/math/complex/acosh.hpp
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
--- a/epoc32/include/stdapis/boost/math/complex/acosh.hpp	Wed Mar 31 12:27:01 2010 +0100
+++ b/epoc32/include/stdapis/boost/math/complex/acosh.hpp	Wed Mar 31 12:33:34 2010 +0100
@@ -1,198 +1,34 @@
-//    boost asinh.hpp header file
-
-//  (C) Copyright Eric Ford 2001 & Hubert Holin.
-//  Distributed under the Boost Software License, Version 1.0. (See
-//  accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org for updates, documentation, and revision history.
-
-#ifndef BOOST_ACOSH_HPP
-#define BOOST_ACOSH_HPP
-
-
-#include <cmath>
-#include <limits>
-#include <string>
-#include <stdexcept>
-
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
-#include <boost/config.hpp>
-
-
-// This is the inverse of the hyperbolic cosine function.
+#ifndef BOOST_MATH_COMPLEX_ACOSH_INCLUDED
+#define BOOST_MATH_COMPLEX_ACOSH_INCLUDED
 
-namespace boost
-{
-    namespace math
-    {
-#if defined(__GNUC__) && (__GNUC__ < 3)
-        // gcc 2.x ignores function scope using declarations,
-        // put them in the scope of the enclosing namespace instead:
-        
-        using    ::std::abs;
-        using    ::std::sqrt;
-        using    ::std::log;
-        
-        using    ::std::numeric_limits;
+#ifndef BOOST_MATH_COMPLEX_DETAILS_INCLUDED
+#  include <boost/math/complex/details.hpp>
+#endif
+#ifndef BOOST_MATH_COMPLEX_ATANH_INCLUDED
+#  include <boost/math/complex/acos.hpp>
 #endif
-        
-#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
-        // This is the main fare
-        
-        template<typename T>
-        inline T    acosh(const T x)
-        {
-            using    ::std::abs;
-            using    ::std::sqrt;
-            using    ::std::log;
-            
-            using    ::std::numeric_limits;
-            
-            
-            T const    one = static_cast<T>(1);
-            T const    two = static_cast<T>(2);
-            
-            static T const    taylor_2_bound = sqrt(numeric_limits<T>::epsilon());
-            static T const    taylor_n_bound = sqrt(taylor_2_bound);
-            static T const    upper_taylor_2_bound = one/taylor_2_bound;
-            
-            if        (x < one)
-            {
-                if    (numeric_limits<T>::has_quiet_NaN)
-                {
-                    return(numeric_limits<T>::quiet_NaN());
-                }
-                else
-                {
-                    ::std::string        error_reporting("Argument to atanh is strictly greater than +1 or strictly smaller than -1!");
-                    ::std::domain_error  bad_argument(error_reporting);
-                    
-                    throw(bad_argument);
-                }
-            }
-            else if    (x >= taylor_n_bound)
-            {
-                if    (x > upper_taylor_2_bound)
-                {
-                    // approximation by laurent series in 1/x at 0+ order from -1 to 0
-                    return( log( x*two) );
-                }
-                else
-                {
-                    return( log( x + sqrt(x*x-one) ) );
-                }
-            }
-            else
-            {
-                T    y = sqrt(x-one);
-                
-                // approximation by taylor series in y at 0 up to order 2
-                T    result = y;
-                
-                if    (y >= taylor_2_bound)
-                {
-                    T    y3 = y*y*y;
-                    
-                    // approximation by taylor series in y at 0 up to order 4
-                    result -= y3/static_cast<T>(12);
-                }
-                
-                return(sqrt(static_cast<T>(2))*result);
-            }
-        }
-#else
-        // These are implementation details (for main fare see below)
-        
-        namespace detail
-        {
-            template    <
-                            typename T,
-                            bool QuietNanSupported
-                        >
-            struct    acosh_helper2_t
-            {
-                static T    get_NaN()
-                {
-                    return(::std::numeric_limits<T>::quiet_NaN());
-                }
-            };  // boost::detail::acosh_helper2_t
-            
-            
-            template<typename T>
-            struct    acosh_helper2_t<T, false>
-            {
-                static T    get_NaN()
-                {
-                    ::std::string        error_reporting("Argument to acosh is greater than or equal to +1!");
-                    ::std::domain_error  bad_argument(error_reporting);
-                    
-                    throw(bad_argument);
-                }
-            };  // boost::detail::acosh_helper2_t
-        
-        }  // boost::detail
-        
-        
-        // This is the main fare
-        
-        template<typename T>
-        inline T    acosh(const T x)
-        {
-            using    ::std::abs;
-            using    ::std::sqrt;
-            using    ::std::log;
-            
-            using    ::std::numeric_limits;
-            
-            typedef    detail::acosh_helper2_t<T, std::numeric_limits<T>::has_quiet_NaN>    helper2_type;
-            
-            
-            T const    one = static_cast<T>(1);
-            T const    two = static_cast<T>(2);
-            
-            static T const    taylor_2_bound = sqrt(numeric_limits<T>::epsilon());
-            static T const    taylor_n_bound = sqrt(taylor_2_bound);
-            static T const    upper_taylor_2_bound = one/taylor_2_bound;
-            
-            if        (x < one)
-            {
-                return(helper2_type::get_NaN());
-            }
-            else if    (x >= taylor_n_bound)
-            {
-                if    (x > upper_taylor_2_bound)
-                {
-                    // approximation by laurent series in 1/x at 0+ order from -1 to 0
-                    return( log( x*two) );
-                }
-                else
-                {
-                    return( log( x + sqrt(x*x-one) ) );
-                }
-            }
-            else
-            {
-                T    y = sqrt(x-one);
-                
-                // approximation by taylor series in y at 0 up to order 2
-                T    result = y;
-                
-                if    (y >= taylor_2_bound)
-                {
-                    T    y3 = y*y*y;
-                    
-                    // approximation by taylor series in y at 0 up to order 4
-                    result -= y3/static_cast<T>(12);
-                }
-                
-                return(sqrt(static_cast<T>(2))*result);
-            }
-        }
-#endif /* defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) */
-    }
+
+namespace boost{ namespace math{
+
+template<class T> 
+inline std::complex<T> acosh(const std::complex<T>& z)
+{
+   //
+   // We use the relation acosh(z) = +-i acos(z)
+   // Choosing the sign of multiplier to give real(acosh(z)) >= 0
+   // as well as compatibility with C99.
+   //
+   std::complex<T> result = boost::math::acos(z);
+   if(!detail::test_is_nan(result.imag()) && result.imag() <= 0)
+      return detail::mult_i(result);
+   return detail::mult_minus_i(result);
 }
 
-#endif /* BOOST_ACOSH_HPP */
+} } // namespaces
 
-
+#endif // BOOST_MATH_COMPLEX_ACOSH_INCLUDED