author | William Roberts <williamr@symbian.org> |
Wed, 31 Mar 2010 12:33:34 +0100 | |
branch | Symbian3 |
changeset 4 | 837f303aceeb |
parent 3 | e1b950c65cb4 |
permissions | -rw-r--r-- |
4
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
1 |
// (C) Copyright John Maddock 2005. |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
2 |
// Use, modification and distribution are subject to the |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
3 |
// Boost Software License, Version 1.0. (See accompanying file |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
4 |
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
2
2fe1408b6811
Final list of Symbian^2 public API header files
William Roberts <williamr@symbian.org>
parents:
diff
changeset
|
5 |
|
4
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
6 |
#ifndef BOOST_MATH_COMPLEX_ATANH_INCLUDED |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
7 |
#define BOOST_MATH_COMPLEX_ATANH_INCLUDED |
2
2fe1408b6811
Final list of Symbian^2 public API header files
William Roberts <williamr@symbian.org>
parents:
diff
changeset
|
8 |
|
4
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
9 |
#ifndef BOOST_MATH_COMPLEX_DETAILS_INCLUDED |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
10 |
# include <boost/math/complex/details.hpp> |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
11 |
#endif |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
12 |
#ifndef BOOST_MATH_LOG1P_INCLUDED |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
13 |
# include <boost/math/special_functions/log1p.hpp> |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
14 |
#endif |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
15 |
#include <boost/assert.hpp> |
2
2fe1408b6811
Final list of Symbian^2 public API header files
William Roberts <williamr@symbian.org>
parents:
diff
changeset
|
16 |
|
4
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
17 |
#ifdef BOOST_NO_STDC_NAMESPACE |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
18 |
namespace std{ using ::sqrt; using ::fabs; using ::acos; using ::asin; using ::atan; using ::atan2; } |
2
2fe1408b6811
Final list of Symbian^2 public API header files
William Roberts <williamr@symbian.org>
parents:
diff
changeset
|
19 |
#endif |
4
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
20 |
|
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
21 |
namespace boost{ namespace math{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
22 |
|
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
23 |
template<class T> |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
24 |
std::complex<T> atanh(const std::complex<T>& z) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
25 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
26 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
27 |
// References: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
28 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
29 |
// Eric W. Weisstein. "Inverse Hyperbolic Tangent." |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
30 |
// From MathWorld--A Wolfram Web Resource. |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
31 |
// http://mathworld.wolfram.com/InverseHyperbolicTangent.html |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
32 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
33 |
// Also: The Wolfram Functions Site, |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
34 |
// http://functions.wolfram.com/ElementaryFunctions/ArcTanh/ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
35 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
36 |
// Also "Abramowitz and Stegun. Handbook of Mathematical Functions." |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
37 |
// at : http://jove.prohosting.com/~skripty/toc.htm |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
38 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
39 |
|
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
40 |
static const T half_pi = static_cast<T>(1.57079632679489661923132169163975144L); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
41 |
static const T pi = static_cast<T>(3.141592653589793238462643383279502884197L); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
42 |
static const T one = static_cast<T>(1.0L); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
43 |
static const T two = static_cast<T>(2.0L); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
44 |
static const T four = static_cast<T>(4.0L); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
45 |
static const T zero = static_cast<T>(0); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
46 |
static const T a_crossover = static_cast<T>(0.3L); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
47 |
|
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
48 |
T x = std::fabs(z.real()); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
49 |
T y = std::fabs(z.imag()); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
50 |
|
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
51 |
T real, imag; // our results |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
52 |
|
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
53 |
T safe_upper = detail::safe_max(two); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
54 |
T safe_lower = detail::safe_min(static_cast<T>(2)); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
55 |
|
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
56 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
57 |
// Begin by handling the special cases specified in C99: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
58 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
59 |
if(detail::test_is_nan(x)) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
60 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
61 |
if(detail::test_is_nan(y)) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
62 |
return std::complex<T>(x, x); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
63 |
else if(std::numeric_limits<T>::has_infinity && (y == std::numeric_limits<T>::infinity())) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
64 |
return std::complex<T>(0, ((z.imag() < 0) ? -half_pi : half_pi)); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
65 |
else |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
66 |
return std::complex<T>(x, x); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
67 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
68 |
else if(detail::test_is_nan(y)) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
69 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
70 |
if(x == 0) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
71 |
return std::complex<T>(x, y); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
72 |
if(std::numeric_limits<T>::has_infinity && (x == std::numeric_limits<T>::infinity())) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
73 |
return std::complex<T>(0, y); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
74 |
else |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
75 |
return std::complex<T>(y, y); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
76 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
77 |
else if((x > safe_lower) && (x < safe_upper) && (y > safe_lower) && (y < safe_upper)) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
78 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
79 |
|
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
80 |
T xx = x*x; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
81 |
T yy = y*y; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
82 |
T x2 = x * two; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
83 |
|
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
84 |
/// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
85 |
// The real part is given by: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
86 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
87 |
// real(atanh(z)) == log((1 + x^2 + y^2 + 2x) / (1 + x^2 + y^2 - 2x)) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
88 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
89 |
// However, when x is either large (x > 1/E) or very small |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
90 |
// (x < E) then this effectively simplifies |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
91 |
// to log(1), leading to wildly inaccurate results. |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
92 |
// By dividing the above (top and bottom) by (1 + x^2 + y^2) we get: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
93 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
94 |
// real(atanh(z)) == log((1 + (2x / (1 + x^2 + y^2))) / (1 - (-2x / (1 + x^2 + y^2)))) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
95 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
96 |
// which is much more sensitive to the value of x, when x is not near 1 |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
97 |
// (remember we can compute log(1+x) for small x very accurately). |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
98 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
99 |
// The cross-over from one method to the other has to be determined |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
100 |
// experimentally, the value used below appears correct to within a |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
101 |
// factor of 2 (and there are larger errors from other parts |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
102 |
// of the input domain anyway). |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
103 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
104 |
T alpha = two*x / (one + xx + yy); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
105 |
if(alpha < a_crossover) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
106 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
107 |
real = boost::math::log1p(alpha) - boost::math::log1p(-alpha); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
108 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
109 |
else |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
110 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
111 |
T xm1 = x - one; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
112 |
real = boost::math::log1p(x2 + xx + yy) - std::log(xm1*xm1 + yy); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
113 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
114 |
real /= four; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
115 |
if(z.real() < 0) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
116 |
real = -real; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
117 |
|
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
118 |
imag = std::atan2((y * two), (one - xx - yy)); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
119 |
imag /= two; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
120 |
if(z.imag() < 0) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
121 |
imag = -imag; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
122 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
123 |
else |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
124 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
125 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
126 |
// This section handles exception cases that would normally cause |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
127 |
// underflow or overflow in the main formulas. |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
128 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
129 |
// Begin by working out the real part, we need to approximate |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
130 |
// alpha = 2x / (1 + x^2 + y^2) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
131 |
// without either overflow or underflow in the squared terms. |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
132 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
133 |
T alpha = 0; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
134 |
if(x >= safe_upper) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
135 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
136 |
// this is really a test for infinity, |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
137 |
// but we may not have the necessary numeric_limits support: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
138 |
if((x > (std::numeric_limits<T>::max)()) || (y > (std::numeric_limits<T>::max)())) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
139 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
140 |
alpha = 0; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
141 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
142 |
else if(y >= safe_upper) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
143 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
144 |
// Big x and y: divide alpha through by x*y: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
145 |
alpha = (two/y) / (x/y + y/x); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
146 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
147 |
else if(y > one) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
148 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
149 |
// Big x: divide through by x: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
150 |
alpha = two / (x + y*y/x); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
151 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
152 |
else |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
153 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
154 |
// Big x small y, as above but neglect y^2/x: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
155 |
alpha = two/x; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
156 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
157 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
158 |
else if(y >= safe_upper) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
159 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
160 |
if(x > one) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
161 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
162 |
// Big y, medium x, divide through by y: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
163 |
alpha = (two*x/y) / (y + x*x/y); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
164 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
165 |
else |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
166 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
167 |
// Small x and y, whatever alpha is, it's too small to calculate: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
168 |
alpha = 0; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
169 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
170 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
171 |
else |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
172 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
173 |
// one or both of x and y are small, calculate divisor carefully: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
174 |
T div = one; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
175 |
if(x > safe_lower) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
176 |
div += x*x; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
177 |
if(y > safe_lower) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
178 |
div += y*y; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
179 |
alpha = two*x/div; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
180 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
181 |
if(alpha < a_crossover) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
182 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
183 |
real = boost::math::log1p(alpha) - boost::math::log1p(-alpha); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
184 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
185 |
else |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
186 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
187 |
// We can only get here as a result of small y and medium sized x, |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
188 |
// we can simply neglect the y^2 terms: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
189 |
BOOST_ASSERT(x >= safe_lower); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
190 |
BOOST_ASSERT(x <= safe_upper); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
191 |
//BOOST_ASSERT(y <= safe_lower); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
192 |
T xm1 = x - one; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
193 |
real = std::log(1 + two*x + x*x) - std::log(xm1*xm1); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
194 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
195 |
|
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
196 |
real /= four; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
197 |
if(z.real() < 0) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
198 |
real = -real; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
199 |
|
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
200 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
201 |
// Now handle imaginary part, this is much easier, |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
202 |
// if x or y are large, then the formula: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
203 |
// atan2(2y, 1 - x^2 - y^2) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
204 |
// evaluates to +-(PI - theta) where theta is negligible compared to PI. |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
205 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
206 |
if((x >= safe_upper) || (y >= safe_upper)) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
207 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
208 |
imag = pi; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
209 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
210 |
else if(x <= safe_lower) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
211 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
212 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
213 |
// If both x and y are small then atan(2y), |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
214 |
// otherwise just x^2 is negligible in the divisor: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
215 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
216 |
if(y <= safe_lower) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
217 |
imag = std::atan2(two*y, one); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
218 |
else |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
219 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
220 |
if((y == zero) && (x == zero)) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
221 |
imag = 0; |
2
2fe1408b6811
Final list of Symbian^2 public API header files
William Roberts <williamr@symbian.org>
parents:
diff
changeset
|
222 |
else |
4
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
223 |
imag = std::atan2(two*y, one - y*y); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
224 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
225 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
226 |
else |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
227 |
{ |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
228 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
229 |
// y^2 is negligible: |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
230 |
// |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
231 |
if((y == zero) && (x == one)) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
232 |
imag = 0; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
233 |
else |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
234 |
imag = std::atan2(two*y, 1 - x*x); |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
235 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
236 |
imag /= two; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
237 |
if(z.imag() < 0) |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
238 |
imag = -imag; |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
239 |
} |
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
240 |
return std::complex<T>(real, imag); |
2
2fe1408b6811
Final list of Symbian^2 public API header files
William Roberts <williamr@symbian.org>
parents:
diff
changeset
|
241 |
} |
2fe1408b6811
Final list of Symbian^2 public API header files
William Roberts <williamr@symbian.org>
parents:
diff
changeset
|
242 |
|
4
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
243 |
} } // namespaces |
2
2fe1408b6811
Final list of Symbian^2 public API header files
William Roberts <williamr@symbian.org>
parents:
diff
changeset
|
244 |
|
4
837f303aceeb
Current Symbian^3 public API header files (from PDK 3.0.h)
William Roberts <williamr@symbian.org>
parents:
3
diff
changeset
|
245 |
#endif // BOOST_MATH_COMPLEX_ATANH_INCLUDED |