21#if GEOGRAPHICLIB_PRECISION == 5
22 return numeric_limits<real>::digits();
24 return numeric_limits<real>::digits;
29#if GEOGRAPHICLIB_PRECISION >= 5
30# if GEOGRAPHICLIB_PRECISION > 5
32 ndigits = numeric_limits<real>::digits;
34 mpfr::mpreal::set_default_prec(ndigits >= 2 ? ndigits : 2);
42#if GEOGRAPHICLIB_PRECISION == 5
43 return numeric_limits<real>::digits10();
45 return numeric_limits<real>::digits10;
51 digits10() > numeric_limits<double>::digits10 ?
52 digits10() - numeric_limits<double>::digits10 : 0;
63 t = s != 0 ? T(0) - (up + vpp) : s;
70 T y = remainder(x, T(
td));
71#if GEOGRAPHICLIB_PRECISION == 4
75 if (y == 0) y = copysign(y, x);
77 return fabs(y) == T(
hd) ? copysign(T(
hd), x) : y;
83 T d =
sum(remainder(-x, T(
td)), remainder( y, T(
td)), e);
86 d =
sum(remainder(d, T(
td)), e, e);
88 if (d == 0 || fabs(d) ==
hd)
91 d = copysign(d, e == 0 ? y - x : -e);
96 static const T z = T(1)/T(16);
100 y = w > 0 ? z - w : y;
101 return copysign(y, x);
108 d = remquo(x, T(
qd), &q);
111 T s = sin(r), c = cos(r);
112 if (2 * fabs(d) ==
qd) {
115 }
else if (3 * fabs(d) ==
qd) {
117 s = copysign(1/T(2), r);
119 switch (
unsigned(q) & 3U) {
120 case 0U: sinx = s; cosx = c;
break;
121 case 1U: sinx = c; cosx = -s;
break;
122 case 2U: sinx = -s; cosx = -c;
break;
123 default: sinx = -c; cosx = s;
break;
128 if (sinx == 0) sinx = copysign(sinx, x);
140 T s = sin(r), c = cos(r);
141 if (2 * fabs(d) ==
qd) {
144 }
else if (3 * fabs(d) ==
qd) {
146 s = copysign(1/T(2), r);
148 switch (
unsigned(q) & 3U) {
149 case 0U: sinx = s; cosx = c;
break;
150 case 1U: sinx = c; cosx = -s;
break;
151 case 2U: sinx = -s; cosx = -c;
break;
152 default: sinx = -c; cosx = s;
break;
157 if (sinx == 0) sinx = copysign(sinx, x+t);
163 T d = remquo(x, T(
qd), &q),
165 unsigned p = unsigned(q);
167 r = p & 1U ? (2 * fabs(d) ==
qd ? sqrt(1/T(2)) :
168 (3 * fabs(d) ==
qd ? sqrt(T(3))/2 : cos(r))) :
169 copysign(2 * fabs(d) ==
qd ? sqrt(1/T(2)) :
170 (3 * fabs(d) ==
qd ? 1/T(2) : sin(r)), r);
172 if (r == 0) r = copysign(r, x);
179 T d = remquo(x, T(
qd), &q),
181 unsigned p = unsigned(q + 1);
182 r = p & 1U ? (2 * fabs(d) ==
qd ? sqrt(1/T(2)) :
183 (3 * fabs(d) ==
qd ? sqrt(T(3))/2 : cos(r))) :
184 copysign(2 * fabs(d) ==
qd ? sqrt(1/T(2)) :
185 (3 * fabs(d) ==
qd ? 1/T(2) : sin(r)), r);
192 static const T overflow = 1 /
sq(numeric_limits<T>::epsilon());
199 return min(max(r, -overflow), overflow);
209 if (fabs(y) > fabs(x)) {
swap(x, y); q = 2; }
210 if (signbit(x)) { x = -x; ++q; }
214 T ang = (atan2(y, x) /
pi<T>()) * T(
hd);
216 case 1: ang = copysign(T(
hd), y) - ang;
break;
217 case 2: ang =
qd - ang;
break;
218 case 3: ang = -
qd + ang;
break;
225 {
return atan2d(x, T(1)); }
228 return es > 0 ? es * atanh(es * x) : -es * atan(es * x);
234 T tau1 = hypot(T(1), tau),
235 sig = sinh(
eatanhe(tau / tau1, es ) );
236 return hypot(T(1), sig) * tau - sig * tau1;
242 static const int numit = 5;
244 static const T tol = sqrt(numeric_limits<T>::epsilon()) / 10;
245 static const T taumax = 2 / sqrt(numeric_limits<T>::epsilon());
258 tau = fabs(taup) > 70 ? taup * exp(
eatanhe(T(1), es)) : taup/e2m,
259 stol = tol * fmax(T(1), fabs(taup));
260 if (!(fabs(tau) < taumax))
return tau;
265 T taupa =
taupf(tau, es),
266 dtau = (taup - taupa) * (1 + e2m *
sq(tau)) /
267 ( e2m * hypot(T(1), tau) * hypot(T(1), taupa) );
269 if (!(fabs(dtau) >= stol))
276#if __cplusplus < 201703L || GEOGRAPHICLIB_PRECISION == 4
277 return sqrt(x*x + y*y + z*z);
279 return hypot(x, y, z);
285 return numeric_limits<T>::has_quiet_NaN ?
286 numeric_limits<T>::quiet_NaN() :
287 (numeric_limits<T>::max)();
289 return numeric_limits<T>::has_quiet_NaN ?
290 numeric_limits<T>::quiet_NaN() :
291 numeric_limits<T>::max();
297 return numeric_limits<T>::has_infinity ?
298 numeric_limits<T>::infinity() :
299 (numeric_limits<T>::max)();
301 return numeric_limits<T>::has_infinity ?
302 numeric_limits<T>::infinity() :
303 numeric_limits<T>::max();
309#define GEOGRAPHICLIB_MATH_INSTANTIATE(T) \
310 template T GEOGRAPHICLIB_EXPORT Math::sum <T>(T, T, T&); \
311 template T GEOGRAPHICLIB_EXPORT Math::AngNormalize <T>(T); \
312 template T GEOGRAPHICLIB_EXPORT Math::AngDiff <T>(T, T, T&); \
313 template T GEOGRAPHICLIB_EXPORT Math::AngRound <T>(T); \
314 template void GEOGRAPHICLIB_EXPORT Math::sincosd <T>(T, T&, T&); \
315 template void GEOGRAPHICLIB_EXPORT Math::sincosde <T>(T, T, T&, T&); \
316 template T GEOGRAPHICLIB_EXPORT Math::sind <T>(T); \
317 template T GEOGRAPHICLIB_EXPORT Math::cosd <T>(T); \
318 template T GEOGRAPHICLIB_EXPORT Math::tand <T>(T); \
319 template T GEOGRAPHICLIB_EXPORT Math::atan2d <T>(T, T); \
320 template T GEOGRAPHICLIB_EXPORT Math::atand <T>(T); \
321 template T GEOGRAPHICLIB_EXPORT Math::eatanhe <T>(T, T); \
322 template T GEOGRAPHICLIB_EXPORT Math::taupf <T>(T, T); \
323 template T GEOGRAPHICLIB_EXPORT Math::tauf <T>(T, T); \
324 template T GEOGRAPHICLIB_EXPORT Math::hypot3 <T>(T, T, T); \
325 template T GEOGRAPHICLIB_EXPORT Math::NaN <T>(); \
326 template T GEOGRAPHICLIB_EXPORT Math::infinity <T>();
329 GEOGRAPHICLIB_MATH_INSTANTIATE(
float)
330 GEOGRAPHICLIB_MATH_INSTANTIATE(
double)
331#if GEOGRAPHICLIB_HAVE_LONG_DOUBLE
333 GEOGRAPHICLIB_MATH_INSTANTIATE(
long double)
335#if GEOGRAPHICLIB_PRECISION > 3
340#undef GEOGRAPHICLIB_MATH_INSTANTIATE
#define GEOGRAPHICLIB_EXPORT
Header for GeographicLib::Math class.
#define GEOGRAPHICLIB_VOLATILE
#define GEOGRAPHICLIB_PANIC(msg)
#define GEOGRAPHICLIB_PRECISION
static void sincosd(T x, T &sinx, T &cosx)
static T atan2d(T y, T x)
static T sum(T u, T v, T &t)
static constexpr int qd
degrees per quarter turn
static T tauf(T taup, T es)
static T hypot3(T x, T y, T z)
static T AngNormalize(T x)
static constexpr int td
degrees per turn
static void sincosde(T x, T t, T &sinx, T &cosx)
static T taupf(T tau, T es)
static T AngDiff(T x, T y, T &e)
static constexpr int hd
degrees per half turn
static T eatanhe(T x, T es)
static int set_digits(int ndigits)
static int extra_digits()
Namespace for GeographicLib.
void swap(GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &a, GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &b)