epoc32/include/stdapis/boost/math/complex/asinh.hpp
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
--- a/epoc32/include/stdapis/boost/math/complex/asinh.hpp	Wed Mar 31 12:27:01 2010 +0100
+++ b/epoc32/include/stdapis/boost/math/complex/asinh.hpp	Wed Mar 31 12:33:34 2010 +0100
@@ -1,101 +1,32 @@
-//    boost asinh.hpp header file
-
-//  (C) Copyright Eric Ford & Hubert Holin 2001.
-//  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_ASINH_HPP
-#define BOOST_ASINH_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 sine function.
+#ifndef BOOST_MATH_COMPLEX_ASINH_INCLUDED
+#define BOOST_MATH_COMPLEX_ASINH_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_ASINH_INCLUDED
+#  include <boost/math/complex/asinh.hpp>
 #endif
-        
-        template<typename T>
-        inline T    asinh(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;
-            static T const    upper_taylor_n_bound = one/taylor_n_bound;
-            
-            if        (x >= +taylor_n_bound)
-            {
-                if        (x > upper_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
-                    {
-                        // approximation by laurent series in 1/x at 0+ order from -1 to 1
-                        return( log( x*two + (one/(x*two)) ) );
-                    }
-                }
-                else
-                {
-                    return( log( x + sqrt(x*x+one) ) );
-                }
-            }
-            else if    (x <= -taylor_n_bound)
-            {
-                return(-asinh(-x));
-            }
-            else
-            {
-                // approximation by taylor series in x at 0 up to order 2
-                T    result = x;
-                
-                if    (abs(x) >= taylor_2_bound)
-                {
-                    T    x3 = x*x*x;
-                    
-                    // approximation by taylor series in x at 0 up to order 4
-                    result -= x3/static_cast<T>(6);
-                }
-                
-                return(result);
-            }
-        }
-    }
+
+namespace boost{ namespace math{
+
+template<class T> 
+inline std::complex<T> asinh(const std::complex<T>& x)
+{
+   //
+   // We use asinh(z) = i asin(-i z);
+   // Note that C99 defines this the other way around (which is
+   // to say asin is specified in terms of asinh), this is consistent
+   // with C99 though:
+   //
+   return ::boost::math::detail::mult_i(::boost::math::asin(::boost::math::detail::mult_minus_i(x)));
 }
 
-#endif /* BOOST_ASINH_HPP */
+} } // namespaces
+
+#endif // BOOST_MATH_COMPLEX_ASINH_INCLUDED