cmath_wrap.hpp
Go to the documentation of this file.
1 // Copyright (C) 2008-2010 NICTA (www.nicta.com.au)
2 // Copyright (C) 2008-2010 Conrad Sanderson
3 //
4 // This file is part of the Armadillo C++ library.
5 // It is provided without any warranty of fitness
6 // for any purpose. You can redistribute this file
7 // and/or modify it under the terms of the GNU
8 // Lesser General Public License (LGPL) as published
9 // by the Free Software Foundation, either version 3
10 // of the License or (at your option) any later version.
11 // (see http://www.opensource.org/licenses for more info)
12 
13 
14 
17 
18 
19 
20 //
21 // wrappers for isfinite
22 //
23 
24 
25 
26 template<typename eT>
28 bool
30  {
31  arma_ignore(val);
32 
33  return true;
34  }
35 
36 
37 
38 template<>
40 bool
41 arma_isfinite(float x)
42  {
43  #if defined(ARMA_HAVE_STD_ISFINITE)
44  {
45  return (std::isfinite(x) != 0);
46  }
47  #else
48  {
49  const bool x_is_inf = ( (x == x) && ((x - x) != float(0)) );
50  const bool x_is_nan = (x != x);
51 
52  return ( (x_is_inf == false) && (x_is_nan == false) );
53  }
54  #endif
55  }
56 
57 
58 
59 template<>
61 bool
62 arma_isfinite(double x)
63  {
64  #if defined(ARMA_HAVE_STD_ISFINITE)
65  {
66  return (std::isfinite(x) != 0);
67  }
68  #else
69  {
70  const bool x_is_inf = ( (x == x) && ((x - x) != double(0)) );
71  const bool x_is_nan = (x != x);
72 
73  return ( (x_is_inf == false) && (x_is_nan == false) );
74  }
75  #endif
76  }
77 
78 
79 
80 template<typename T>
82 bool
83 arma_isfinite(const std::complex<T>& x)
84  {
85  if( (arma_isfinite(x.real()) == false) || (arma_isfinite(x.imag()) == false) )
86  {
87  return false;
88  }
89  else
90  {
91  return true;
92  }
93  }
94 
95 
96 
97 //
98 // wrappers for trigonometric functions
99 //
100 
101 
102 
103 // Wherever possible, try to use TR1 versions of the functions below,
104 // otherwise fall back to Boost Math.
105 //
106 // complex acos
107 // complex asin
108 // complex atan
109 //
110 // real acosh
111 // real asinh
112 // real atanh
113 //
114 // complex acosh
115 // complex asinh
116 // complex atanh
117 //
118 //
119 // If TR1 not present and Boost math not present,
120 // we have our own rudimentary versions of:
121 //
122 // real acosh
123 // real asinh
124 // real atanh
125 
126 
127 
128 #if defined(ARMA_USE_BOOST)
129  #define arma_boost_wrap(trig_fn, val) ( (boost::math::trig_fn)(val) )
130 #else
131  #define arma_boost_wrap(trig_fn, val) ( arma_stop( #trig_fn "(): need Boost libraries" ), val )
132 #endif
133 
134 
135 template<typename T>
137 std::complex<T>
138 arma_acos(const std::complex<T>& x)
139  {
140  #if defined(ARMA_HAVE_STD_TR1)
141  {
142  return std::tr1::acos(x);
143  }
144  #else
145  {
146  return arma_boost_wrap(acos, x);
147  }
148  #endif
149  }
150 
151 
152 
153 template<typename T>
155 std::complex<T>
156 arma_asin(const std::complex<T>& x)
157  {
158  #if defined(ARMA_HAVE_STD_TR1)
159  {
160  return std::tr1::asin(x);
161  }
162  #else
163  {
164  return arma_boost_wrap(asin, x);
165  }
166  #endif
167  }
168 
169 
170 
171 template<typename T>
173 std::complex<T>
174 arma_atan(const std::complex<T>& x)
175  {
176  #if defined(ARMA_HAVE_STD_TR1)
177  {
178  return std::tr1::atan(x);
179  }
180  #else
181  {
182  return arma_boost_wrap(atan, x);
183  }
184  #endif
185  }
186 
187 
188 
189 template<typename eT>
191 eT
192 arma_acosh(const eT x)
193  {
194  #if defined(ARMA_HAVE_STD_TR1)
195  {
196  return std::tr1::acosh(x);
197  }
198  #elif defined(ARMA_USE_BOOST)
199  {
200  return boost::math::acosh(x);
201  }
202  #else
203  {
204  if(x >= eT(1))
205  {
206  // http://functions.wolfram.com/ElementaryFunctions/ArcCosh/02/
207  return std::log( x + std::sqrt(x*x - eT(1)) );
208  }
209  else
210  {
211  if(std::numeric_limits<eT>::has_quiet_NaN == true)
212  {
213  return -(std::numeric_limits<eT>::quiet_NaN());
214  }
215  else
216  {
217  return eT(0);
218  }
219  }
220  }
221  #endif
222  }
223 
224 
225 
226 template<typename eT>
228 eT
229 arma_asinh(const eT x)
230  {
231  #if defined(ARMA_HAVE_STD_TR1)
232  {
233  return std::tr1::asinh(x);
234  }
235  #elif defined(ARMA_USE_BOOST)
236  {
237  return boost::math::asinh(x);
238  }
239  #else
240  {
241  // http://functions.wolfram.com/ElementaryFunctions/ArcSinh/02/
242  return std::log( x + std::sqrt(x*x + eT(1)) );
243  }
244  #endif
245  }
246 
247 
248 
249 template<typename eT>
251 eT
252 arma_atanh(const eT x)
253  {
254  #if defined(ARMA_HAVE_STD_TR1)
255  {
256  return std::tr1::atanh(x);
257  }
258  #elif defined(ARMA_USE_BOOST)
259  {
260  return boost::math::atanh(x);
261  }
262  #else
263  {
264  if( (x >= eT(-1)) && (x <= eT(+1)) )
265  {
266  // http://functions.wolfram.com/ElementaryFunctions/ArcTanh/02/
267  return std::log( ( eT(1)+x ) / ( eT(1)-x ) ) / eT(2);
268  }
269  else
270  {
271  if(std::numeric_limits<eT>::has_quiet_NaN == true)
272  {
273  return -(std::numeric_limits<eT>::quiet_NaN());
274  }
275  else
276  {
277  return eT(0);
278  }
279  }
280  }
281  #endif
282  }
283 
284 
285 
286 template<typename T>
288 std::complex<T>
289 arma_acosh(const std::complex<T>& x)
290  {
291  #if defined(ARMA_HAVE_STD_TR1)
292  {
293  return std::tr1::acosh(x);
294  }
295  #else
296  {
297  return arma_boost_wrap(acosh, x);
298  }
299  #endif
300  }
301 
302 
303 
304 template<typename T>
306 std::complex<T>
307 arma_asinh(const std::complex<T>& x)
308  {
309  #if defined(ARMA_HAVE_STD_TR1)
310  {
311  return std::tr1::asinh(x);
312  }
313  #else
314  {
315  return arma_boost_wrap(asinh, x);
316  }
317  #endif
318  }
319 
320 
321 
322 template<typename T>
324 std::complex<T>
325 arma_atanh(const std::complex<T>& x)
326  {
327  #if defined(ARMA_HAVE_STD_TR1)
328  {
329  return std::tr1::atanh(x);
330  }
331  #else
332  {
333  return arma_boost_wrap(atanh, x);
334  }
335  #endif
336  }
337 
338 
339 
340 #undef arma_boost_wrap
341 
342 
343 
arma_inline eT arma_asinh(const eT x)
Definition: cmath_wrap.hpp:229
arma_inline std::complex< T > arma_asin(const std::complex< T > &x)
Definition: cmath_wrap.hpp:156
arma_inline const eOp< T1, eop_sqrt > sqrt(const Base< typename T1::elem_type, T1 > &A)
Definition: fn_elem.hpp:403
arma_inline const eOp< T1, eop_acosh > acosh(const Base< typename T1::elem_type, T1 > &A)
Definition: fn_trig.hpp:111
arma_inline std::complex< T > arma_atan(const std::complex< T > &x)
Definition: cmath_wrap.hpp:174
arma_inline const eOp< T1, eop_atanh > atanh(const Base< typename T1::elem_type, T1 > &A)
Definition: fn_trig.hpp:327
arma_inline eT arma_acosh(const eT x)
Definition: cmath_wrap.hpp:192
arma_inline const eOp< T1, eop_atan > atan(const Base< typename T1::elem_type, T1 > &A)
Definition: fn_trig.hpp:273
#define arma_ignore(variable)
arma_inline const eOp< T1, eop_asin > asin(const Base< typename T1::elem_type, T1 > &A)
Definition: fn_trig.hpp:165
arma_inline const eOp< T1, eop_asinh > asinh(const Base< typename T1::elem_type, T1 > &A)
Definition: fn_trig.hpp:219
arma_inline const eOp< T1, eop_acos > acos(const Base< typename T1::elem_type, T1 > &A)
Definition: fn_trig.hpp:57
#define arma_inline
arma_inline const eOp< T1, eop_log > log(const Base< typename T1::elem_type, T1 > &A)
Definition: fn_elem.hpp:156
arma_inline std::complex< T > arma_acos(const std::complex< T > &x)
Definition: cmath_wrap.hpp:138
arma_inline eT arma_atanh(const eT x)
Definition: cmath_wrap.hpp:252
arma_inline bool arma_isfinite(eT val)
Definition: cmath_wrap.hpp:29
#define arma_boost_wrap(trig_fn, val)
Definition: cmath_wrap.hpp:131


armadillo_matrix
Author(s):
autogenerated on Fri Apr 16 2021 02:31:56