math_utils.hpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #ifndef _SCTL_MATH_UTILS_
  2. #define _SCTL_MATH_UTILS_
  3. #include <sctl/common.hpp>
  4. #include <cmath>
  5. #include <ostream>
  6. namespace SCTL_NAMESPACE {
  7. template <class Real> inline constexpr Integer significant_bits();
  8. template <class Real> inline constexpr Real machine_eps();
  9. template <class Real> Real atoreal(const char* str);
  10. template <class Real> inline constexpr Real const_pi() { return (Real)3.1415926535897932384626433832795028841L; }
  11. template <class Real> inline constexpr Real const_e() { return (Real)2.7182818284590452353602874713526624977L; }
  12. template <class Real> inline Real fabs(const Real a) { return (Real)std::fabs(a); }
  13. template <class Real> inline Real round(const Real a) { return (Real)std::round(a); }
  14. template <class Real> inline Real floor(const Real a) { return (Real)std::floor(a); }
  15. template <class Real> inline Real sqrt(const Real a) { return (Real)std::sqrt(a); }
  16. template <class Real> inline Real sin(const Real a) { return (Real)std::sin(a); }
  17. template <class Real> inline Real cos(const Real a) { return (Real)std::cos(a); }
  18. template <class Real> inline Real acos(const Real a) { return (Real)std::acos(a); }
  19. template <class Real> inline Real exp(const Real a) { return (Real)std::exp(a); }
  20. template <class Real> inline Real log(const Real a) { return (Real)std::log(a); }
  21. template <class Real, class ExpType> inline Real pow(const Real b, const ExpType e);
  22. template <Long e, class ValueType> inline constexpr ValueType pow(ValueType b);
  23. #ifdef SCTL_QUAD_T
  24. class QuadReal {
  25. typedef SCTL_QUAD_T QuadRealType;
  26. public:
  27. QuadReal() = default;
  28. constexpr QuadReal(const QuadReal& v) = default;
  29. QuadReal& operator=(const QuadReal&) = default;
  30. ~QuadReal() = default;
  31. template <class ValueType> constexpr QuadReal(ValueType v) : val((QuadRealType)v) {}
  32. template <class ValueType> explicit constexpr operator ValueType() const { return (ValueType)val; }
  33. QuadReal& operator+=(const QuadReal& x) { val += x.val; return *this; }
  34. QuadReal& operator-=(const QuadReal& x) { val -= x.val; return *this; }
  35. QuadReal& operator*=(const QuadReal& x) { val *= x.val; return *this; }
  36. QuadReal& operator/=(const QuadReal& x) { val /= x.val; return *this; }
  37. constexpr QuadReal operator+(const QuadReal& x) const { return QuadReal(val + x.val); }
  38. constexpr QuadReal operator-(const QuadReal& x) const { return QuadReal(val - x.val); }
  39. constexpr QuadReal operator*(const QuadReal& x) const { return QuadReal(val * x.val); }
  40. constexpr QuadReal operator/(const QuadReal& x) const { return QuadReal(val / x.val); }
  41. constexpr QuadReal operator-() const { return QuadReal(-val); }
  42. constexpr bool operator< (const QuadReal& x) const { return val < x.val; }
  43. constexpr bool operator> (const QuadReal& x) const { return val > x.val; }
  44. constexpr bool operator!=(const QuadReal& x) const { return val != x.val; }
  45. constexpr bool operator==(const QuadReal& x) const { return val == x.val; }
  46. constexpr bool operator<=(const QuadReal& x) const { return val <= x.val; }
  47. constexpr bool operator>=(const QuadReal& x) const { return val >= x.val; }
  48. constexpr friend QuadReal operator+(const QuadRealType& a, const QuadReal& b) { return QuadReal(a) + b; }
  49. constexpr friend QuadReal operator-(const QuadRealType& a, const QuadReal& b) { return QuadReal(a) - b; }
  50. constexpr friend QuadReal operator*(const QuadRealType& a, const QuadReal& b) { return QuadReal(a) * b; }
  51. constexpr friend QuadReal operator/(const QuadRealType& a, const QuadReal& b) { return QuadReal(a) / b; }
  52. constexpr friend bool operator< (const QuadRealType& a, const QuadReal& b) { return QuadReal(a) < b; }
  53. constexpr friend bool operator> (const QuadRealType& a, const QuadReal& b) { return QuadReal(a) > b; }
  54. constexpr friend bool operator!=(const QuadRealType& a, const QuadReal& b) { return QuadReal(a) != b; }
  55. constexpr friend bool operator==(const QuadRealType& a, const QuadReal& b) { return QuadReal(a) == b; }
  56. constexpr friend bool operator<=(const QuadRealType& a, const QuadReal& b) { return QuadReal(a) <= b; }
  57. constexpr friend bool operator>=(const QuadRealType& a, const QuadReal& b) { return QuadReal(a) >= b; }
  58. friend QuadReal round(const QuadReal& x) {
  59. #ifdef __SIZEOF_INT128__
  60. return (__int128)((x+(QuadReal)0.5).val)-(x<(QuadReal)-0.5);
  61. #else
  62. return (int64_t)((x+(QuadReal)0.5).val)-(x<(QuadReal)-0.5);
  63. #endif
  64. }
  65. friend QuadReal floor(const QuadReal& x) {
  66. #ifdef __SIZEOF_INT128__
  67. return (__int128)(x.val)-(x<0);
  68. #else
  69. return (int64_t)(x.val)-(x<0);
  70. #endif
  71. }
  72. private:
  73. QuadRealType val;
  74. };
  75. inline std::ostream& operator<<(std::ostream& output, const QuadReal& x);
  76. inline std::istream& operator>>(std::istream& inputstream, QuadReal& x);
  77. #endif
  78. } // end namespace
  79. #include SCTL_INCLUDE(math_utils.txx)
  80. #endif //_SCTL_MATH_UTILS_HPP_