14 #if !defined(GEOGRAPHICLIB_MATH_HPP) 15 #define GEOGRAPHICLIB_MATH_HPP 1 20 #if !defined(GEOGRAPHICLIB_CXX11_MATH) 28 # if defined(__GNUC__) && __cplusplus >= 201103 && \ 29 !(defined(__ANDROID__) || defined(ANDROID) || defined(__CYGWIN__)) 30 # define GEOGRAPHICLIB_CXX11_MATH 1 32 # elif defined(_MSC_VER) && _MSC_VER >= 1800 33 # define GEOGRAPHICLIB_CXX11_MATH 1 35 # define GEOGRAPHICLIB_CXX11_MATH 0 39 #if !defined(GEOGRAPHICLIB_WORDS_BIGENDIAN) 40 # define GEOGRAPHICLIB_WORDS_BIGENDIAN 0 43 #if !defined(GEOGRAPHICLIB_HAVE_LONG_DOUBLE) 44 # define GEOGRAPHICLIB_HAVE_LONG_DOUBLE 0 47 #if !defined(GEOGRAPHICLIB_PRECISION) 57 # define GEOGRAPHICLIB_PRECISION 2 64 #if GEOGRAPHICLIB_PRECISION == 4 65 #include <boost/version.hpp> 66 #if BOOST_VERSION >= 105600 67 #include <boost/cstdfloat.hpp> 69 #include <boost/multiprecision/float128.hpp> 70 #include <boost/math/special_functions.hpp> 71 __float128 fmaq(__float128, __float128, __float128);
72 #elif GEOGRAPHICLIB_PRECISION == 5 76 #if GEOGRAPHICLIB_PRECISION > 3 78 #define GEOGRAPHICLIB_VOLATILE 81 #define GEOGRAPHICLIB_PANIC \ 82 (throw GeographicLib::GeographicErr("Convergence failure"), false) 84 #define GEOGRAPHICLIB_VOLATILE volatile 87 #define GEOGRAPHICLIB_PANIC false 107 "Bad value of precision");
112 #if GEOGRAPHICLIB_HAVE_LONG_DOUBLE 122 #if GEOGRAPHICLIB_PRECISION == 2 130 #elif GEOGRAPHICLIB_PRECISION == 1 132 #elif GEOGRAPHICLIB_PRECISION == 3 133 typedef extended
real;
134 #elif GEOGRAPHICLIB_PRECISION == 4 135 typedef boost::multiprecision::float128
real;
136 #elif GEOGRAPHICLIB_PRECISION == 5 146 #if GEOGRAPHICLIB_PRECISION != 5 147 return std::numeric_limits<real>::digits;
149 return std::numeric_limits<real>::digits();
164 #if GEOGRAPHICLIB_PRECISION != 5 176 #if GEOGRAPHICLIB_PRECISION != 5 177 return std::numeric_limits<real>::digits10;
179 return std::numeric_limits<real>::digits10();
189 digits10() > std::numeric_limits<double>::digits10 ?
190 digits10() - std::numeric_limits<double>::digits10 : 0;
202 template<
typename T>
static T pi() {
204 static const T pi =
atan2(
T(0),
T(-1));
210 static real
pi() {
return pi<real>(); }
217 static const T degree = pi<T>() / 180;
223 static real
degree() {
return degree<real>(); }
232 template<
typename T>
static T sq(
T x)
244 #if GEOGRAPHICLIB_CXX11_MATH 251 return x *
sqrt(1 + y * y);
266 #if GEOGRAPHICLIB_CXX11_MATH 277 return abs(x) > 1 ?
z : (
z == 0 ? x : x *
z /
log(y));
289 #if GEOGRAPHICLIB_CXX11_MATH 300 return z == 0 ? x : x *
log(y) /
z;
312 #if GEOGRAPHICLIB_CXX11_MATH 317 return x < 0 ? -y :
y;
329 #if GEOGRAPHICLIB_CXX11_MATH 333 y =
log1p(2 * y/(1 - y))/2;
334 return x < 0 ? -y :
y;
346 #if GEOGRAPHICLIB_CXX11_MATH 351 return x < 0 ? -y :
y;
370 #if GEOGRAPHICLIB_CXX11_MATH 429 {
T y = N < 0 ? 0 : *p++;
while (--N >= 0) y = y * x + *p++;
return y; }
441 #if GEOGRAPHICLIB_CXX11_MATH && GEOGRAPHICLIB_PRECISION != 4 443 x =
remainder(x,
T(360));
return x != -180 ? x : 180;
447 #if defined(_MSC_VER) && _MSC_VER < 1900 455 return y <= -180 ? y + 360 : (y <= 180 ? y : y - 360);
468 {
using std::abs;
return abs(x) > 90 ? NaN<T>() : x; }
487 #if GEOGRAPHICLIB_CXX11_MATH && GEOGRAPHICLIB_PRECISION != 4 492 T t, d = AngNormalize(
sum(AngNormalize(-x), AngNormalize(y), t));
500 return sum(d == 180 && t > 0 ? -180 : d, t, e);
518 {
T e;
return AngDiff(x, y, e); }
537 static const T z = 1/
T(16);
538 if (x == 0)
return 0;
541 y = y < z ? z - (z -
y) : y;
542 return x < 0 ? -y :
y;
563 #if GEOGRAPHICLIB_CXX11_MATH && GEOGRAPHICLIB_PRECISION <= 3 && \ 583 #if defined(_MSC_VER) && _MSC_VER < 1900 592 switch (
unsigned(q) & 3
U) {
593 case 0U: sinx =
s; cosx =
c;
break;
594 case 1U: sinx =
c; cosx = -
s;
break;
595 case 2U: sinx = -
s; cosx = -
c;
break;
596 default: sinx = -
c; cosx =
s;
break;
599 if (x != 0) { sinx +=
T(0); cosx +=
T(0); }
613 #if GEOGRAPHICLIB_CXX11_MATH && GEOGRAPHICLIB_PRECISION <= 3 && \ 625 unsigned p = unsigned(q);
628 if (x != 0) r +=
T(0);
643 #if GEOGRAPHICLIB_CXX11_MATH && GEOGRAPHICLIB_PRECISION <= 3 && \ 655 unsigned p = unsigned(q + 1);
675 return c != 0 ? s / c : (s < 0 ? -overflow : overflow);
699 if (x < 0) { x = -
x; ++
q; }
709 case 1: ang = (y >= 0 ? 180 : -180) - ang;
break;
710 case 2: ang = 90 - ang;
break;
711 case 3: ang = -90 + ang;
break;
724 {
return atan2d(x,
T(1)); }
738 template<
typename T>
static T eatanhe(
T x,
T es);
752 #if GEOGRAPHICLIB_CXX11_MATH 757 return abs(x) * (y < 0 || (y == 0 && 1/y < 0) ? -1 : 1);
778 template<
typename T>
static T taupf(
T tau,
T es);
797 template<
typename T>
static T tauf(
T taup,
T es);
807 #if GEOGRAPHICLIB_CXX11_MATH 811 #if defined(_MSC_VER) 830 template<
typename T>
static T NaN() {
831 #if defined(_MSC_VER) 832 return std::numeric_limits<T>::has_quiet_NaN ?
833 std::numeric_limits<T>::quiet_NaN() :
836 return std::numeric_limits<T>::has_quiet_NaN ?
837 std::numeric_limits<T>::quiet_NaN() :
844 static real
NaN() {
return NaN<real>(); }
853 template<
typename T>
static bool isnan(
T x) {
854 #if GEOGRAPHICLIB_CXX11_MATH 868 #if defined(_MSC_VER) 869 return std::numeric_limits<T>::has_infinity ?
870 std::numeric_limits<T>::infinity() :
873 return std::numeric_limits<T>::has_infinity ?
874 std::numeric_limits<T>::infinity() :
881 static real
infinity() {
return infinity<real>(); }
890 template<
typename T>
static T swab(
T x) {
893 unsigned char c[
sizeof(
T)];
896 for (
int i =
sizeof(
T)/2;
i--; )
901 #if GEOGRAPHICLIB_PRECISION == 4 902 typedef boost::math::policies::policy
903 < boost::math::policies::domain_error
904 <boost::math::policies::errno_on_error>,
905 boost::math::policies::pole_error
906 <boost::math::policies::errno_on_error>,
907 boost::math::policies::overflow_error
908 <boost::math::policies::errno_on_error>,
909 boost::math::policies::evaluation_error
910 <boost::math::policies::errno_on_error> >
911 boost_special_functions_policy;
913 static real
hypot(real x, real
y)
916 static real
expm1(real x)
919 static real
log1p(real x)
922 static real
asinh(real x)
925 static real
atanh(real x)
928 static real
cbrt(real x)
931 static real
fma(real x, real y, real
z)
932 {
return fmaq(__float128(x), __float128(y), __float128(z)); }
934 static real
copysign(real x, real y)
945 #endif // GEOGRAPHICLIB_MATH_HPP static T AngNormalize(T x)
static T sum(T u, T v, T &t)
static int set_digits(int ndigits)
#define GEOGRAPHICLIB_EXPORT
const mpreal cbrt(const mpreal &x, mp_rnd_t r=mpreal::get_default_rnd())
#define GEOGRAPHICLIB_WORDS_BIGENDIAN
EIGEN_DEVICE_FUNC const ExpReturnType exp() const
static bool isfinite(T x)
const mpreal asinh(const mpreal &x, mp_rnd_t r=mpreal::get_default_rnd())
EIGEN_DEVICE_FUNC const LogReturnType log() const
EIGEN_DEVICE_FUNC const SqrtReturnType sqrt() const
Mathematical functions needed by GeographicLib.
const mpreal expm1(const mpreal &x, mp_rnd_t r=mpreal::get_default_rnd())
static void sincosd(T x, T &sinx, T &cosx)
static T AngDiff(T x, T y, T &e)
static void norm(T &x, T &y)
#define GEOGRAPHICLIB_PRECISION
#define GEOGRAPHICLIB_VOLATILE
const mpreal remainder(const mpreal &x, const mpreal &y, mp_rnd_t rnd_mode=mpreal::get_default_rnd())
static int extra_digits()
const mpreal atanh(const mpreal &x, mp_rnd_t r=mpreal::get_default_rnd())
EIGEN_DEVICE_FUNC const CosReturnType cos() const
mpreal copysign(const mpreal &x, const mpreal &y, mp_rnd_t rnd_mode=mpreal::get_default_rnd())
EIGEN_DEVICE_FUNC const Log1pReturnType log1p() const
static T atan2d(T y, T x)
Eigen::Triplet< double > T
static T polyval(int N, const T p[], T x)
Namespace for GeographicLib.
static void set_default_prec(mp_prec_t prec)
Array< double, 1, 3 > e(1./3., 0.5, 2.)
const mpreal sum(const mpreal tab[], const unsigned long int n, int &status, mp_rnd_t mode=mpreal::get_default_rnd())
EIGEN_DEVICE_FUNC const Scalar & q
static T AngDiff(T x, T y)
Jet< T, N > atan2(const Jet< T, N > &g, const Jet< T, N > &f)
static T copysign(T x, T y)
const mpreal hypot(const mpreal &x, const mpreal &y, mp_rnd_t rnd_mode=mpreal::get_default_rnd())
EIGEN_DEVICE_FUNC const FloorReturnType floor() const
const mpreal fma(const mpreal &v1, const mpreal &v2, const mpreal &v3, mp_rnd_t rnd_mode=mpreal::get_default_rnd())
Header for GeographicLib::Constants class.
EigenSolver< MatrixXf > es
static T fma(T x, T y, T z)
EIGEN_DEVICE_FUNC const SinReturnType sin() const
const mpreal remquo(long *q, const mpreal &x, const mpreal &y, mp_rnd_t rnd_mode=mpreal::get_default_rnd())
Jet< T, N > pow(const Jet< T, N > &f, double g)
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
void swap(mpfr::mpreal &x, mpfr::mpreal &y)
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T fmod(const T &a, const T &b)