You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
154 lines
3.7 KiB
154 lines
3.7 KiB
// Boost.Units - A C++ library for zero-overhead dimensional analysis and |
|
// unit/quantity manipulation and conversion |
|
// |
|
// Copyright (C) 2003-2008 Matthias Christian Schabel |
|
// Copyright (C) 2008 Steven Watanabe |
|
// |
|
// 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) |
|
|
|
#ifndef BOOST_UNITS_CMATH_IMPL_HPP |
|
#define BOOST_UNITS_CMATH_IMPL_HPP |
|
|
|
#include <boost/config.hpp> |
|
#include <boost/math/special_functions/fpclassify.hpp> |
|
|
|
namespace boost { |
|
namespace units { |
|
namespace detail { |
|
|
|
template<class Y> |
|
inline bool isgreater BOOST_PREVENT_MACRO_SUBSTITUTION(const Y& v1,const Y& v2) |
|
{ |
|
if((boost::math::isnan)(v1) || (boost::math::isnan)(v2)) return false; |
|
else return v1 > v2; |
|
} |
|
|
|
template<class Y> |
|
inline bool isgreaterequal BOOST_PREVENT_MACRO_SUBSTITUTION(const Y& v1,const Y& v2) |
|
{ |
|
if((boost::math::isnan)(v1) || (boost::math::isnan)(v2)) return false; |
|
else return v1 >= v2; |
|
} |
|
|
|
template<class Y> |
|
inline bool isless BOOST_PREVENT_MACRO_SUBSTITUTION(const Y& v1,const Y& v2) |
|
{ |
|
if((boost::math::isnan)(v1) || (boost::math::isnan)(v2)) return false; |
|
else return v1 < v2; |
|
} |
|
|
|
template<class Y> |
|
inline bool islessequal BOOST_PREVENT_MACRO_SUBSTITUTION(const Y& v1,const Y& v2) |
|
{ |
|
if((boost::math::isnan)(v1) || (boost::math::isnan)(v2)) return false; |
|
else return v1 <= v2; |
|
} |
|
|
|
template<class Y> |
|
inline bool islessgreater BOOST_PREVENT_MACRO_SUBSTITUTION(const Y& v1,const Y& v2) |
|
{ |
|
if((boost::math::isnan)(v1) || (boost::math::isnan)(v2)) return false; |
|
else return v1 < v2 || v1 > v2; |
|
} |
|
|
|
template<class Y> |
|
inline bool isunordered BOOST_PREVENT_MACRO_SUBSTITUTION(const Y& v1,const Y& v2) |
|
{ |
|
return (boost::math::isnan)(v1) || (boost::math::isnan)(v2); |
|
} |
|
|
|
template<class Y> |
|
inline Y fdim BOOST_PREVENT_MACRO_SUBSTITUTION(const Y& v1,const Y& v2) |
|
{ |
|
if((boost::math::isnan)(v1)) return v1; |
|
else if((boost::math::isnan)(v2)) return v2; |
|
else if(v1 > v2) return(v1 - v2); |
|
else return(Y(0)); |
|
} |
|
|
|
#if 0 |
|
|
|
template<class T> |
|
struct fma_issue_warning { |
|
enum { value = false }; |
|
}; |
|
|
|
template<class Y> |
|
inline Y fma(const Y& v1,const Y& v2,const Y& v3) |
|
{ |
|
//this implementation does *not* meet the |
|
//requirement of infinite intermediate precision |
|
BOOST_STATIC_WARNING((fma_issue_warning<Y>::value)); |
|
|
|
return v1 * v2 + v3; |
|
} |
|
|
|
#endif |
|
|
|
template<class Y> |
|
inline Y fmax BOOST_PREVENT_MACRO_SUBSTITUTION(const Y& v1,const Y& v2) |
|
{ |
|
if((boost::math::isnan)(v1)) return(v2); |
|
else if((boost::math::isnan)(v2)) return(v1); |
|
else if(v1 > v2) return(v1); |
|
else return(v2); |
|
} |
|
|
|
template<class Y> |
|
inline Y fmin BOOST_PREVENT_MACRO_SUBSTITUTION(const Y& v1,const Y& v2) |
|
{ |
|
if((boost::math::isnan)(v1)) return(v2); |
|
else if((boost::math::isnan)(v2)) return(v1); |
|
else if(v1 < v2) return(v1); |
|
else return(v2); |
|
} |
|
|
|
//template<class Y> |
|
//inline long long llrint(const Y& val) |
|
//{ |
|
// return static_cast<long long>(rint(val)); |
|
//} |
|
// |
|
//template<class Y> |
|
//inline long long llround(const Y& val) |
|
//{ |
|
// return static_cast<long long>(round(val)); |
|
//} |
|
|
|
#if 0 |
|
|
|
template<class Y> |
|
inline Y nearbyint(const Y& val) |
|
{ |
|
//this is not really correct. |
|
//the result should be according to the |
|
//current rounding mode. |
|
using boost::math::round; |
|
return round(val); |
|
} |
|
|
|
template<class Y> |
|
inline Y rint(const Y& val) |
|
{ |
|
//I don't feel like trying to figure out |
|
//how to raise a floating pointer exception |
|
return nearbyint(val); |
|
} |
|
|
|
#endif |
|
|
|
template<class Y> |
|
inline Y trunc BOOST_PREVENT_MACRO_SUBSTITUTION(const Y& val) |
|
{ |
|
if(val > 0) return std::floor(val); |
|
else if(val < 0) return std::ceil(val); |
|
else return val; |
|
} |
|
|
|
} |
|
} |
|
} |
|
|
|
#endif // BOOST_UNITS_CMATH_IMPL_HPP
|
|
|