Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/math/complex/details.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/math/complex/details.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,96 @@ +// (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) + +#ifndef BOOST_MATH_COMPLEX_DETAILS_INCLUDED +#define BOOST_MATH_COMPLEX_DETAILS_INCLUDED +// +// This header contains all the support code that is common to the +// inverse trig complex functions, it also contains all the includes +// that we need to implement all these functions. +// +#include <boost/config.hpp> +#include <boost/detail/workaround.hpp> +#include <boost/config/no_tr1/complex.hpp> +#include <boost/limits.hpp> +#include <math.h> // isnan where available +#include <boost/config/no_tr1/cmath.hpp> +#include <boost/math/special_functions/sign.hpp> +#include <boost/math/special_functions/fpclassify.hpp> +#include <boost/math/special_functions/sign.hpp> +#include <boost/math/constants/constants.hpp> + +#ifdef BOOST_NO_STDC_NAMESPACE +namespace std{ using ::sqrt; } +#endif + +namespace boost{ namespace math{ namespace detail{ + +template <class T> +inline T mult_minus_one(const T& t) +{ + return (boost::math::isnan)(t) ? t : (boost::math::changesign)(t); +} + +template <class T> +inline std::complex<T> mult_i(const std::complex<T>& t) +{ + return std::complex<T>(mult_minus_one(t.imag()), t.real()); +} + +template <class T> +inline std::complex<T> mult_minus_i(const std::complex<T>& t) +{ + return std::complex<T>(t.imag(), mult_minus_one(t.real())); +} + +template <class T> +inline T safe_max(T t) +{ + return std::sqrt((std::numeric_limits<T>::max)()) / t; +} +inline long double safe_max(long double t) +{ + // long double sqrt often returns infinity due to + // insufficient internal precision: + return std::sqrt((std::numeric_limits<double>::max)()) / t; +} +#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) +// workaround for type deduction bug: +inline float safe_max(float t) +{ + return std::sqrt((std::numeric_limits<float>::max)()) / t; +} +inline double safe_max(double t) +{ + return std::sqrt((std::numeric_limits<double>::max)()) / t; +} +#endif +template <class T> +inline T safe_min(T t) +{ + return std::sqrt((std::numeric_limits<T>::min)()) * t; +} +inline long double safe_min(long double t) +{ + // long double sqrt often returns zero due to + // insufficient internal precision: + return std::sqrt((std::numeric_limits<double>::min)()) * t; +} +#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) +// type deduction workaround: +inline double safe_min(double t) +{ + return std::sqrt((std::numeric_limits<double>::min)()) * t; +} +inline float safe_min(float t) +{ + return std::sqrt((std::numeric_limits<float>::min)()) * t; +} +#endif + +} } } // namespaces + +#endif // BOOST_MATH_COMPLEX_DETAILS_INCLUDED +