trunc.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 93 行

HPP
93
字号
//  Copyright John Maddock 2007.//  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_TRUNC_HPP#define BOOST_MATH_TRUNC_HPP#ifdef _MSC_VER#pragma once#endif#include <boost/math/tools/config.hpp>#include <boost/math/policies/error_handling.hpp>#include <boost/math/special_functions/fpclassify.hpp>namespace boost{ namespace math{template <class T, class Policy>inline T trunc(const T& v, const Policy& pol){   BOOST_MATH_STD_USING   if(!(boost::math::isfinite)(v))      return policies::raise_rounding_error("boost::math::trunc<%1%>(%1%)", 0, v, pol);   return (v >= 0) ? floor(v) : ceil(v);}template <class T>inline T trunc(const T& v){   return trunc(v, policies::policy<>());}//// The following functions will not compile unless T has an// implicit convertion to the integer types.  For user-defined// number types this will likely not be the case.  In that case// these functions should either be specialized for the UDT in// question, or else overloads should be placed in the same // namespace as the UDT: these will then be found via argument// dependent lookup.  See our concept archetypes for examples.//template <class T, class Policy>inline int itrunc(const T& v, const Policy& pol){   BOOST_MATH_STD_USING   T r = boost::math::trunc(v, pol);   if(fabs(r) > (std::numeric_limits<int>::max)())      return static_cast<int>(policies::raise_rounding_error("boost::math::itrunc<%1%>(%1%)", 0, v, pol));   return static_cast<int>(r);}template <class T>inline int itrunc(const T& v){   return itrunc(v, policies::policy<>());}template <class T, class Policy>inline long ltrunc(const T& v, const Policy& pol){   BOOST_MATH_STD_USING   T r = boost::math::trunc(v, pol);   if(fabs(r) > (std::numeric_limits<long>::max)())      return static_cast<long>(policies::raise_rounding_error("boost::math::ltrunc<%1%>(%1%)", 0, v, pol));   return static_cast<long>(r);}template <class T>inline long ltrunc(const T& v){   return ltrunc(v, policies::policy<>());}#ifdef BOOST_HAS_LONG_LONGtemplate <class T, class Policy>inline boost::long_long_type lltrunc(const T& v, const Policy& pol){   BOOST_MATH_STD_USING   T r = boost::math::trunc(v, pol);   if(fabs(r) > (std::numeric_limits<boost::long_long_type>::max)())      return static_cast<boost::long_long_type>(policies::raise_rounding_error("boost::math::lltrunc<%1%>(%1%)", 0, v, pol));   return static_cast<boost::long_long_type>(r);}template <class T>inline boost::long_long_type lltrunc(const T& v){   return lltrunc(v, policies::policy<>());}#endif}} // namespaces#endif // BOOST_MATH_TRUNC_HPP

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?