18 #ifndef BUBBLEPROFILER_MATH_WRAPPERS_HPP_INCLUDED 19 #define BUBBLEPROFILER_MATH_WRAPPERS_HPP_INCLUDED 21 #include <boost/math/constants/constants.hpp> 22 #include <boost/math/special_functions/bessel.hpp> 23 #include <boost/math/special_functions/sign.hpp> 27 #include <type_traits> 31 static constexpr
double Pi = boost::math::double_constants::pi;
40 T
Abs(
const std::complex<T>& z) noexcept
45 template <
typename Order,
typename Argument>
47 -> decltype(boost::math::cyl_bessel_i(v, z))
49 return boost::math::cyl_bessel_i(v, z);
52 template <
typename Order,
typename Argument>
54 -> decltype(boost::math::cyl_bessel_j(v, z))
56 return boost::math::cyl_bessel_j(v, z);
59 template <
typename Order,
typename Argument>
61 -> decltype(boost::math::cyl_bessel_k(v, z))
63 return boost::math::cyl_bessel_k(v, z);
66 template <
typename Order,
typename Argument>
68 -> decltype(boost::math::cyl_neumann(v, z))
70 return boost::math::cyl_neumann(v, z);
74 typename =
typename std::enable_if<
75 std::is_floating_point<T>::value,T>
::type>
82 typename =
typename std::enable_if<
83 std::is_integral<T>::value,T>
::type>
84 double Exp(T n) noexcept
90 std::complex<T>
Exp(
const std::complex<T>& z) noexcept
96 typename =
typename std::enable_if<
97 std::is_floating_point<T>::value,T>
::type>
103 template <
typename T,
104 typename =
typename std::enable_if<
105 std::is_integral<T>::value,T>
::type>
111 template <
typename T>
112 std::complex<T>
Log(
const std::complex<T>& z) noexcept
117 template <
typename T>
120 return boost::math::sign(x);
123 template <
typename T,
124 typename =
typename std::enable_if<
125 std::is_floating_point<T>::value,T>
::type>
131 template <
typename T,
132 typename =
typename std::enable_if<
133 std::is_integral<T>::value,T>
::type>
139 template <
typename T>
140 std::complex<T>
Cos(
const std::complex<T>& z) noexcept
145 template <
typename T,
146 typename =
typename std::enable_if<
147 std::is_floating_point<T>::value,T>
::type>
153 template <
typename T,
154 typename =
typename std::enable_if<
155 std::is_integral<T>::value,T>
::type>
161 template <
typename T>
162 std::complex<T>
Sin(
const std::complex<T>& z) noexcept
167 template <
typename T,
168 typename =
typename std::enable_if<
169 std::is_floating_point<T>::value,T>
::type>
175 template <
typename T,
176 typename =
typename std::enable_if<
177 std::is_integral<T>::value,T>
::type>
183 template <
typename T>
184 std::complex<T>
Tan(
const std::complex<T>& z) noexcept
189 template <
typename T>
190 auto Cot(T x) noexcept -> decltype(
Tan(x))
195 template <
typename T>
196 auto Csc(T x) noexcept -> decltype(
Sin(x))
201 template <
typename T>
202 auto Sec(T x) noexcept -> decltype(
Cos(x))
207 template <
typename T,
208 typename =
typename std::enable_if<
209 std::is_floating_point<T>::value,T>
::type>
215 template <
typename T,
216 typename =
typename std::enable_if<
217 std::is_integral<T>::value,T>
::type>
223 template <
typename T>
224 std::complex<T>
ArcCos(
const std::complex<T>& z) noexcept
229 template <
typename T,
230 typename =
typename std::enable_if<
231 std::is_floating_point<T>::value,T>
::type>
237 template <
typename T,
238 typename =
typename std::enable_if<
239 std::is_integral<T>::value,T>
::type>
245 template <
typename T>
246 std::complex<T>
ArcSin(
const std::complex<T>& z) noexcept
251 template <
typename T,
252 typename =
typename std::enable_if<
253 std::is_floating_point<T>::value,T>
::type>
259 template <
typename T,
260 typename =
typename std::enable_if<
261 std::is_integral<T>::value,T>
::type>
267 template <
typename T>
268 std::complex<T>
ArcTan(
const std::complex<T>& z) noexcept
273 template <
typename T,
274 typename =
typename std::enable_if<
275 std::is_floating_point<T>::value,T>
::type>
281 template <
typename T,
282 typename =
typename std::enable_if<
283 std::is_integral<T>::value,T>
::type>
289 template <
typename T>
290 std::complex<T>
Cosh(
const std::complex<T>& z) noexcept
295 template <
typename T,
296 typename =
typename std::enable_if<
297 std::is_floating_point<T>::value,T>
::type>
303 template <
typename T,
304 typename =
typename std::enable_if<
305 std::is_integral<T>::value,T>
::type>
311 template <
typename T>
312 std::complex<T>
Sinh(
const std::complex<T>& z) noexcept
317 template <
typename T,
318 typename =
typename std::enable_if<
319 std::is_floating_point<T>::value,T>
::type>
325 template <
typename T,
326 typename =
typename std::enable_if<
327 std::is_integral<T>::value,T>
::type>
333 template <
typename T>
334 std::complex<T>
Tanh(
const std::complex<T>& z) noexcept
339 template <
typename T>
345 template <
typename T>
351 template <
typename T>
357 template <
typename T,
358 typename =
typename std::enable_if<
359 std::is_floating_point<T>::value,T>
::type>
362 return std::acosh(x);
365 template <
typename T,
366 typename =
typename std::enable_if<
367 std::is_integral<T>::value,T>
::type>
370 return std::acosh(n);
373 template <
typename T>
374 std::complex<T>
ArcCosh(
const std::complex<T>& z) noexcept
376 return std::acosh(z);
379 template <
typename T,
380 typename =
typename std::enable_if<
381 std::is_floating_point<T>::value,T>
::type>
384 return std::asinh(x);
387 template <
typename T,
388 typename =
typename std::enable_if<
389 std::is_integral<T>::value,T>
::type>
392 return std::asinh(n);
395 template <
typename T>
396 std::complex<T>
ArcSinh(
const std::complex<T>& z) noexcept
398 return std::asinh(z);
401 template <
typename T,
402 typename =
typename std::enable_if<
403 std::is_floating_point<T>::value,T>
::type>
406 return std::atanh(x);
409 template <
typename T,
410 typename =
typename std::enable_if<
411 std::is_integral<T>::value,T>
::type>
414 return std::atanh(n);
417 template <
typename T>
418 std::complex<T>
ArcTanh(
const std::complex<T>& z) noexcept
420 return std::atanh(z);
423 template <
typename T,
424 typename =
typename std::enable_if<
425 std::is_arithmetic<T>::value,T>
::type>
431 template <
typename T>
432 T
Im(
const std::complex<T>& z) noexcept
437 template <
typename T,
438 typename =
typename std::enable_if<
439 std::is_arithmetic<T>::value,T>
::type>
445 template <
typename T>
446 T
Re(
const std::complex<T>& z) noexcept
451 template <
typename T,
452 typename =
typename std::enable_if<
453 std::is_floating_point<T>::value,T>
::type>
459 template <
typename T,
460 typename =
typename std::enable_if<
461 std::is_integral<T>::value,T>
::type>
auto BesselK(Order v, Argument z) -> decltype(boost::math::cyl_bessel_k(v, z))
auto Csch(T x) noexcept-> decltype(Sinh(x))
auto BesselI(Order v, Argument z) -> decltype(boost::math::cyl_bessel_i(v, z))
auto abs(const Eigen::MatrixBase< Derived > &m) -> decltype(m.cwiseAbs())
auto BesselJ(Order v, Argument z) -> decltype(boost::math::cyl_bessel_j(v, z))
auto BesselY(Order v, Argument z) -> decltype(boost::math::cyl_neumann(v, z))
auto Coth(T x) noexcept-> decltype(Tanh(x))
auto Cot(T x) noexcept-> decltype(Tan(x))
auto Sech(T x) noexcept-> decltype(Cosh(x))
auto Csc(T x) noexcept-> decltype(Sin(x))
auto Sec(T x) noexcept-> decltype(Cos(x))