modf.hpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Copyright John Maddock 2007.
  2. // Use, modification and distribution are subject to the
  3. // Boost Software License, Version 1.0. (See accompanying file
  4. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef BOOST_MATH_MODF_HPP
  6. #define BOOST_MATH_MODF_HPP
  7. #ifdef _MSC_VER
  8. #pragma once
  9. #endif
  10. #include <boost/math/tools/config.hpp>
  11. #include <boost/math/special_functions/trunc.hpp>
  12. namespace boost{ namespace math{
  13. template <class T, class Policy>
  14. inline T modf(const T& v, T* ipart, const Policy& pol)
  15. {
  16. *ipart = trunc(v, pol);
  17. return v - *ipart;
  18. }
  19. template <class T>
  20. inline T modf(const T& v, T* ipart)
  21. {
  22. return modf(v, ipart, policies::policy<>());
  23. }
  24. template <class T, class Policy>
  25. inline T modf(const T& v, int* ipart, const Policy& pol)
  26. {
  27. *ipart = itrunc(v, pol);
  28. return v - *ipart;
  29. }
  30. template <class T>
  31. inline T modf(const T& v, int* ipart)
  32. {
  33. return modf(v, ipart, policies::policy<>());
  34. }
  35. template <class T, class Policy>
  36. inline T modf(const T& v, long* ipart, const Policy& pol)
  37. {
  38. *ipart = ltrunc(v, pol);
  39. return v - *ipart;
  40. }
  41. template <class T>
  42. inline T modf(const T& v, long* ipart)
  43. {
  44. return modf(v, ipart, policies::policy<>());
  45. }
  46. #ifdef BOOST_HAS_LONG_LONG
  47. template <class T, class Policy>
  48. inline T modf(const T& v, boost::long_long_type* ipart, const Policy& pol)
  49. {
  50. *ipart = lltrunc(v, pol);
  51. return v - *ipart;
  52. }
  53. template <class T>
  54. inline T modf(const T& v, boost::long_long_type* ipart)
  55. {
  56. return modf(v, ipart, policies::policy<>());
  57. }
  58. #endif
  59. }} // namespaces
  60. #endif // BOOST_MATH_MODF_HPP