modf.hpp 1.8 KB

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