GeographicLib: GeographicLib::Math Class Reference (original) (raw)

Mathematical functions needed by GeographicLib. More...

#include <[GeographicLib/Math.hpp](Math%5F8hpp%5Fsource.html)>

Public Types
typedef double extended
typedef double real
Static Public Member Functions
static int digits ()
static int set_digits (int ndigits)
static int digits10 ()
static int extra_digits ()
template
static T pi ()
template
static T degree ()
template
static T sq (T x)
template
static void norm (T &x, T &y)
template
static T sum (T u, T v, T &t)
template
static T polyval (int N, const T p[], T x)
template
static T AngNormalize (T x)
template
static T LatFix (T x)
template
static T AngDiff (T x, T y, T &e)
template
static T AngDiff (T x, T y)
template
static T AngRound (T x)
template
static void sincosd (T x, T &sinx, T &cosx)
template
static void sincosde (T x, T t, T &sinx, T &cosx)
template
static T sind (T x)
template
static T cosd (T x)
template
static T tand (T x)
template
static T atan2d (T y, T x)
template
static T atand (T x)
template
static T eatanhe (T x, T es)
template
static T taupf (T tau, T es)
template
static T tauf (T taup, T es)
template
static T hypot3 (T x, T y, T z)
template
static T NaN ()
template
static T infinity ()
template
static T swab (T x)
Static Public Attributes
static constexpr int qd = 90
degrees per quarter turn
static constexpr int dm = 60
minutes per degree
static constexpr int ms = 60
seconds per minute
static constexpr int hd = 2 * qd
degrees per half turn
static constexpr int td = 2 * hd
degrees per turn
static constexpr int ds = dm * ms
seconds per degree
static const bool bigendian = GEOGRAPHICLIB_WORDS_BIGENDIAN

Mathematical functions needed by GeographicLib.

Define mathematical functions in order to localize system dependencies and to provide generic versions of the functions. In addition define a real type to be used by GeographicLib.

Example of use:

#include

#include

using namespace std;

try {

cout << Math::pi() << " " << Math::sq(Math::pi()) << "\n";

}

catch (const exception& e) {

cerr << "Caught exception: " << e.what() << "\n";

return 1;

}

}

int main(int argc, const char *const argv[])

Header for GeographicLib::Math class.

Namespace for GeographicLib.

Definition at line 77 of file Math.hpp.

extended

typedef double GeographicLib::Math::extended

real

typedef double GeographicLib::Math::real

digits()

int GeographicLib::Math::digits ( ) static

set_digits()

int GeographicLib::Math::set_digits ( int ndigits) static

Set the binary precision of a real number.

Parameters

[in] ndigits the number of bits of precision.

Returns

the resulting number of bits of precision.

This only has an effect when GEOGRAPHICLIB_PRECISION = 5. See also Utility::set_digits for caveats about when this routine should be called.

Definition at line 29 of file Math.cpp.

References digits().

Referenced by GeographicLib::Utility::set_digits().

digits10()

int GeographicLib::Math::digits10 ( ) static

Returns

the number of decimal digits of precision in a real number.

Definition at line 38 of file Math.cpp.

Referenced by extra_digits().

extra_digits()

int GeographicLib::Math::extra_digits ( ) static

pi()

template

static T GeographicLib::Math::pi ( ) inlinestatic

Template Parameters

T the type of the returned value.

Returns

π.

Definition at line 199 of file Math.hpp.

Referenced by GeographicLib::EllipticFunction::D(), GeographicLib::EllipticFunction::deltaD(), GeographicLib::EllipticFunction::deltaE(), GeographicLib::EllipticFunction::deltaEinv(), GeographicLib::EllipticFunction::deltaF(), GeographicLib::EllipticFunction::deltaG(), GeographicLib::EllipticFunction::deltaH(), GeographicLib::EllipticFunction::deltaPi(), GeographicLib::EllipticFunction::E(), GeographicLib::EllipticFunction::Einv(), GeographicLib::EllipticFunction::F(), GeographicLib::TransverseMercator::Forward(), GeographicLib::EllipticFunction::G(), GeographicLib::EllipticFunction::H(), GeographicLib::Intersect::Intersect(), GeographicLib::NormalGravity::J2ToFlattening(), GeographicLib::EllipticFunction::Pi(), GeographicLib::AuxLatitude::Rectifying(), GeographicLib::AuxLatitude::RectifyingRadius(), GeographicLib::DST::refine(), GeographicLib::EllipticFunction::Reset(), GeographicLib::TransverseMercator::Reverse(), GeographicLib::EllipticFunction::RF(), GeographicLib::EllipticFunction::RG(), GeographicLib::DST::transform(), and GeographicLib::NormalGravity::V0().

degree()

template

static T GeographicLib::Math::degree ( ) inlinestatic

Template Parameters

T the type of the returned value.

Returns

the number of radians in a degree.

Definition at line 209 of file Math.hpp.

Referenced by GeographicLib::MagneticModel::FieldComponents(), GeographicLib::CassiniSoldner::Forward(), GeographicLib::AlbersEqualArea::Forward(), GeographicLib::LambertConformalConic::Forward(), GeographicLib::TransverseMercatorExact::Forward(), GeographicLib::GeodesicLine::GenPosition(), GeographicLib::GeodesicLineExact::GenPosition(), GeographicLib::RhumbLine::GenPosition(), GeographicLib::AuxAngle::lamd(), GeographicLib::AuxAngle::lamd(), GeographicLib::AlbersEqualArea::Reverse(), GeographicLib::LambertConformalConic::Reverse(), GeographicLib::TransverseMercatorExact::Reverse(), GeographicLib::GravityModel::SphericalAnomaly(), GeographicLib::experimental::JacobiConformal::x(), and GeographicLib::experimental::JacobiConformal::y().

sq()

template

static T GeographicLib::Math::sq ( T x) inlinestatic

Square a number.

Template Parameters

T the type of the argument and the returned value.

Parameters

Returns

_x_2.

Definition at line 221 of file Math.hpp.

Referenced by GeographicLib::AuxLatitude::Authalic(), GeographicLib::AuxLatitude::AuthalicRadiusSquared(), GeographicLib::SphericalEngine::Circle(), GeographicLib::DAuxLatitude::DRectifying(), GeographicLib::MagneticModel::FieldComponents(), GeographicLib::NormalGravity::FlatteningToJ2(), GeographicLib::PolarStereographic::Forward(), GeographicLib::AlbersEqualArea::Forward(), GeographicLib::LambertConformalConic::Forward(), GeographicLib::TransverseMercator::Forward(), GeographicLib::GeodesicLine::GenPosition(), GeographicLib::GeodesicLineExact::GenPosition(), GeographicLib::GravityModel::GravityModel(), GeographicLib::NormalGravity::J2ToFlattening(), GeographicLib::NormalGravity::Phi(), GeographicLib::AuxLatitude::Rectifying(), GeographicLib::AuxLatitude::RectifyingRadius(), GeographicLib::EllipticFunction::Reset(), GeographicLib::PolarStereographic::Reverse(), GeographicLib::AlbersEqualArea::Reverse(), GeographicLib::LambertConformalConic::Reverse(), GeographicLib::TransverseMercator::Reverse(), GeographicLib::EllipticFunction::RG(), GeographicLib::EllipticFunction::RJ(), GeographicLib::AlbersEqualArea::SetScale(), GeographicLib::NormalGravity::SurfaceGravity(), tand(), tauf(), GeographicLib::TransverseMercator::TransverseMercator(), GeographicLib::NormalGravity::V0(), GeographicLib::SphericalEngine::Value(), GeographicLib::experimental::JacobiConformal::x(), GeographicLib::experimental::JacobiConformal::x(), GeographicLib::experimental::JacobiConformal::y(), and GeographicLib::experimental::JacobiConformal::y().

norm()

template

static void GeographicLib::Math::norm ( T & x, T & y ) inlinestatic

Normalize a two-vector.

Template Parameters

T the type of the argument and the returned value.

Parameters

[in,out] x on output set to x/hypot(x, y).
[in,out] y on output set to y/hypot(x, y).

Definition at line 231 of file Math.hpp.

Referenced by GeographicLib::CassiniSoldner::Reset().

sum()

template

T GeographicLib::Math::sum ( T u, T v, T & t ) static

The error-free sum of two numbers.

Template Parameters

T the type of the argument and the returned value.

Parameters

[in] u
[in] v
[out] t the exact error given by (u + v) - s.

Returns

s = round(u + v).

See D. E. Knuth, TAOCP, Vol 2, 4.2.2, Theorem B.

Note

t can be the same as one of the first two arguments.

Definition at line 52 of file Math.cpp.

References GEOGRAPHICLIB_VOLATILE.

Referenced by AngDiff().

polyval()

template

static T GeographicLib::Math::polyval ( int N, const T _p_[], T x ) inlinestatic

AngNormalize()

template

T GeographicLib::Math::AngNormalize ( T x) static

Normalize an angle.

Template Parameters

T the type of the argument and returned value.

Parameters

[in] x the angle in degrees.

Returns

the angle reduced to the range [−180°, 180°].

The range of x is unrestricted. If the result is ±0° or ±180° then the sign is the sign of x.

Definition at line 66 of file Math.cpp.

References hd, and td.

Referenced by GeographicLib::Geoid::CacheArea(), GeographicLib::DMS::DecodeAzimuth(), GeographicLib::EllipticFunction::Ed(), GeographicLib::DMS::Encode(), GeographicLib::PolarStereographic::Forward(), GeographicLib::Geohash::Forward(), GeographicLib::GARS::Forward(), GeographicLib::Georef::Forward(), GeographicLib::CassiniSoldner::Forward(), GeographicLib::TransverseMercator::Forward(), GeographicLib::Geodesic::GenDirectLine(), GeographicLib::GeodesicExact::GenDirectLine(), GeographicLib::GeodesicLine::GenPosition(), GeographicLib::GeodesicLineExact::GenPosition(), GeographicLib::RhumbLine::GenPosition(), GeographicLib::GeodesicLine::GeodesicLine(), GeographicLib::GeodesicLineExact::GeodesicLineExact(), GeographicLib::LocalCartesian::Reset(), GeographicLib::PolarStereographic::Reverse(), GeographicLib::AlbersEqualArea::Reverse(), GeographicLib::LambertConformalConic::Reverse(), GeographicLib::TransverseMercator::Reverse(), GeographicLib::TransverseMercatorExact::Reverse(), and GeographicLib::UTMUPS::StandardZone().

LatFix()

template

static T GeographicLib::Math::LatFix ( T x) inlinestatic

AngDiff() [1/2]

template

T GeographicLib::Math::AngDiff ( T x, T y, T & e ) static

The exact difference of two angles reduced to [−180°, 180°].

Template Parameters

T the type of the arguments and returned value.

Parameters

[in] x the first angle in degrees.
[in] y the second angle in degrees.
[out] e the error term in degrees.

Returns

d, the truncated value of yx.

This computes z = yx exactly, reduced to [−180°, 180°]; and then sets z = d + e where d is the nearest representable number to z and e is the truncation error. If z = ±0° or ±180°, then the sign of d is given by the sign of yx. The maximum absolute value of e is 2−26 (for doubles).

Definition at line 77 of file Math.cpp.

References hd, sum(), and td.

Referenced by GeographicLib::UTMUPS::Forward(), GeographicLib::CassiniSoldner::Forward(), GeographicLib::AlbersEqualArea::Forward(), GeographicLib::LambertConformalConic::Forward(), GeographicLib::TransverseMercator::Forward(), GeographicLib::TransverseMercatorExact::Forward(), and GeographicLib::Rhumb::GenInverse().

AngDiff() [2/2]

template

static T GeographicLib::Math::AngDiff ( T x, T y ) inlinestatic

Difference of two angles reduced to [−180°, 180°]

Template Parameters

T the type of the arguments and returned value.

Parameters

[in] x the first angle in degrees.
[in] y the second angle in degrees.

Returns

yx, reduced to the range [−180°, 180°].

The result is equivalent to computing the difference exactly, reducing it to [−180°, 180°] and rounding the result.

Definition at line 343 of file Math.hpp.

AngRound()

template

T GeographicLib::Math::AngRound ( T x) static

sincosd()

template

void GeographicLib::Math::sincosd ( T x, T & sinx, T & cosx ) static

Evaluate the sine and cosine function with the argument in degrees

Template Parameters

T the type of the arguments.

Parameters

[in] x in degrees.
[out] sinx sin(x).
[out] cosx cos(x).

The results obey exactly the elementary properties of the trigonometric functions, e.g., sin 9° = cos 81° = − sin 123456789°. If x = −0 or a negative multiple of 180°, then sinx = −0; this is the only case where −0 is returned.

Definition at line 101 of file Math.cpp.

References qd.

Referenced by GeographicLib::AlbersEqualArea::AlbersEqualArea(), GeographicLib::AlbersEqualArea::AlbersEqualArea(), GeographicLib::AuxAngle::degrees(), GeographicLib::EllipticFunction::Ed(), GeographicLib::MagneticCircle::FieldGeocentric(), GeographicLib::PolarStereographic::Forward(), GeographicLib::CassiniSoldner::Forward(), GeographicLib::AzimuthalEquidistant::Forward(), GeographicLib::Gnomonic::Forward(), GeographicLib::AlbersEqualArea::Forward(), GeographicLib::LambertConformalConic::Forward(), GeographicLib::TransverseMercator::Forward(), GeographicLib::Geodesic::GenDirectLine(), GeographicLib::GeodesicExact::GenDirectLine(), GeographicLib::GeodesicLine::GenPosition(), GeographicLib::GeodesicLineExact::GenPosition(), GeographicLib::GeodesicLine::GeodesicLine(), GeographicLib::GeodesicLineExact::GeodesicLineExact(), GeographicLib::LambertConformalConic::LambertConformalConic(), GeographicLib::LambertConformalConic::LambertConformalConic(), GeographicLib::CassiniSoldner::Reset(), GeographicLib::LocalCartesian::Reset(), tand(), GeographicLib::experimental::JacobiConformal::x(), and GeographicLib::experimental::JacobiConformal::y().

sincosde()

template

void GeographicLib::Math::sincosde ( T x, T t, T & sinx, T & cosx ) static

Evaluate the sine and cosine with reduced argument plus correction

Template Parameters

T the type of the arguments.

Parameters

[in] x reduced angle in degrees.
[in] t correction in degrees.
[out] sinx sin(x + t).
[out] cosx cos(x + t).

This is a variant of Math::sincosd allowing a correction to the angle to be supplied. x must be in [−180°, 180°] and t is assumed to be a small correction. Math::AngRound is applied to the reduced angle to prevent problems with x + t being extremely close but not exactly equal to one of the four cardinal directions.

Definition at line 128 of file Math.cpp.

References AngRound(), and qd.

sind()

template

T GeographicLib::Math::sind ( T x) static

Evaluate the sine function with the argument in degrees

Template Parameters

T the type of the argument and the returned value.

Parameters

Returns

sin(x).

The result is +0 for x = +0 and positive multiples of 180°. The result is −0 for x = -0 and negative multiples of 180°.

Definition at line 157 of file Math.cpp.

References qd.

Referenced by GeographicLib::NormalGravity::SurfaceGravity().

cosd()

template

T GeographicLib::Math::cosd ( T x) static

Evaluate the cosine function with the argument in degrees

Template Parameters

T the type of the argument and the returned value.

Parameters

Returns

cos(x).

The result is +0 for x an odd multiple of 90°.

Definition at line 173 of file Math.cpp.

References qd.

tand()

template

T GeographicLib::Math::tand ( T x) static

atan2d()

template

T GeographicLib::Math::atan2d ( T y, T x ) static

Evaluate the atan2 function with the result in degrees

Template Parameters

T the type of the arguments and the returned value.

Parameters

Returns

atan2(y, x) in degrees.

The result is in the range [−180° 180°]. N.B., atan2d(±0, −1) = ±180°.

Definition at line 199 of file Math.cpp.

References hd, qd, and std::swap().

Referenced by atand(), GeographicLib::AuxAngle::degrees(), GeographicLib::MagneticModel::FieldComponents(), GeographicLib::TransverseMercator::Forward(), GeographicLib::Geodesic::GenInverse(), GeographicLib::GeodesicExact::GenInverse(), GeographicLib::Rhumb::GenInverse(), GeographicLib::GeodesicLine::GenPosition(), GeographicLib::GeodesicLineExact::GenPosition(), GeographicLib::Geodesic::InverseLine(), GeographicLib::GeodesicExact::InverseLine(), GeographicLib::PolarStereographic::Reverse(), GeographicLib::AzimuthalEquidistant::Reverse(), GeographicLib::Gnomonic::Reverse(), and GeographicLib::TransverseMercator::Reverse().

atand()

template

T GeographicLib::Math::atand ( T x) static

eatanhe()

template

T GeographicLib::Math::eatanhe ( T x, T es ) static

Evaluate e atanh(e x)

Template Parameters

T the type of the argument and the returned value.

Parameters

[in] x
[in] es the signed eccentricity = sign(_e_2) sqrt(|_e_2

Returns

e atanh(e x)

If _e_2 is negative (e is imaginary), the expression is evaluated in terms of atan.

Definition at line 221 of file Math.cpp.

Referenced by GeographicLib::LambertConformalConic::Forward(), tauf(), and taupf().

taupf()

template

T GeographicLib::Math::taupf ( T tau, T es ) static

tauf()

template

T GeographicLib::Math::tauf ( T taup, T es ) static

tanφ in terms of tanχ

Template Parameters

T the type of the argument and the returned value.

Parameters

[in] taup τ′ = tanχ
[in] es the signed eccentricity = sign(_e_2) sqrt(|_e_2

Returns

τ = tanφ

See Eqs. (19–21) of C. F. F. Karney, Transverse Mercator with an accuracy of a few nanometers, J. Geodesy 85(8), 475–485 (Aug. 2011) (preprint arXiv:1002.1417).

Definition at line 235 of file Math.cpp.

References eatanhe(), GEOGRAPHICLIB_PANIC, sq(), and taupf().

Referenced by GeographicLib::TransverseMercatorExact::Forward(), GeographicLib::PolarStereographic::Reverse(), GeographicLib::LambertConformalConic::Reverse(), GeographicLib::TransverseMercator::Reverse(), and GeographicLib::TransverseMercatorExact::Reverse().

hypot3()

template

T GeographicLib::Math::hypot3 ( T x, T y, T z ) static

Implement hypot with 3 parameters

Template Parameters

T the type of the argument and the returned value.

Parameters

Returns

sqrt(_x_2 + _y_2 + _z_2).

Definition at line 269 of file Math.cpp.

NaN()

template

T GeographicLib::Math::NaN ( ) static

The NaN (not a number)

Template Parameters

T the type of the returned value.

Returns

NaN if available, otherwise return the max real of type T.

Definition at line 277 of file Math.cpp.

Referenced by GeographicLib::GravityModel::Circle(), GeographicLib::PolygonAreaT< GeodType >::Clear(), GeographicLib::UTMUPS::Forward(), GeographicLib::Gnomonic::Forward(), GeographicLib::GeodesicLine::GenPosition(), GeographicLib::GeodesicLineExact::GenPosition(), GeographicLib::RhumbLine::GenPosition(), GeographicLib::OSGB::GridReference(), GeographicLib::NormalGravity::J2ToFlattening(), main(), GeographicLib::AuxAngle::NaN(), GeographicLib::GARS::Reverse(), GeographicLib::Geohash::Reverse(), GeographicLib::Georef::Reverse(), GeographicLib::MGRS::Reverse(), GeographicLib::UTMUPS::Reverse(), GeographicLib::Gnomonic::Reverse(), GeographicLib::GeodesicLine::SetArc(), GeographicLib::GeodesicLineExact::SetArc(), and GeographicLib::PolygonAreaT< GeodType >::TestEdge().

infinity()

template

T GeographicLib::Math::infinity ( ) static

swab()

template

static T GeographicLib::Math::swab ( T x) inlinestatic

Swap the bytes of a quantity

Template Parameters

T the type of the argument and the returned value.

Parameters

Returns

x with its bytes swapped.

Definition at line 538 of file Math.hpp.

References std::swap().

qd

constexpr int GeographicLib::Math::qd = 90 staticconstexpr

degrees per quarter turn

The constants defining the standard (Babylonian) meanings of degrees, minutes, and seconds, for angles. Read the constants as follows (for example): ms = 60 is the ratio 1 minute / 1 second. The abbreviations are

Note that degree() is ratio 1 degree / 1 radian, thus, for example, Math::degree() * Math::qd is the ratio 1 quarter turn / 1 radian = π/2.

Defining all these in one place would mean that it's simple to convert to the centesimal system for measuring angles. The DMS class assumes that Math::dm and Math::ms are less than or equal to 100 (so that two digits suffice for the integer parts of the minutes and degrees components of an angle). Switching to the centesimal convention will break most of the tests. Also the normal definition of degree is baked into some classes, e.g., UTMUPS, MGRS, Georef, Geohash, etc.

Definition at line 145 of file Math.hpp.

Referenced by GeographicLib::AlbersEqualArea::AlbersEqualArea(), GeographicLib::AlbersEqualArea::AlbersEqualArea(), GeographicLib::AlbersEqualArea::AlbersEqualArea(), atan2d(), cosd(), GeographicLib::DMS::DecodeLatLon(), GeographicLib::PolarStereographic::Forward(), GeographicLib::UTMUPS::Forward(), GeographicLib::Geohash::Forward(), GeographicLib::GARS::Forward(), GeographicLib::Georef::Forward(), GeographicLib::CassiniSoldner::Forward(), GeographicLib::TransverseMercator::Forward(), GeographicLib::TransverseMercatorExact::Forward(), GeographicLib::RhumbLine::GenPosition(), GeographicLib::LambertConformalConic::LambertConformalConic(), GeographicLib::LambertConformalConic::LambertConformalConic(), GeographicLib::LambertConformalConic::LambertConformalConic(), main(), GeographicLib::Geohash::Reverse(), GeographicLib::MGRS::Reverse(), GeographicLib::TransverseMercator::Reverse(), GeographicLib::TransverseMercatorExact::Reverse(), GeographicLib::CassiniSoldner::Reverse(), GeographicLib::AlbersEqualArea::SetScale(), GeographicLib::LambertConformalConic::SetScale(), GeographicLib::PolarStereographic::SetScale(), sincosd(), sincosde(), and sind().

dm

constexpr int GeographicLib::Math::dm = 60 staticconstexpr

ms

constexpr int GeographicLib::Math::ms = 60 staticconstexpr

hd

constexpr int GeographicLib::Math::hd = 2 * qd staticconstexpr

degrees per half turn

Definition at line 148 of file Math.hpp.

Referenced by AngDiff(), AngNormalize(), atan2d(), GeographicLib::Geohash::Forward(), GeographicLib::GARS::Forward(), GeographicLib::TransverseMercator::Forward(), GeographicLib::TransverseMercatorExact::Forward(), GeographicLib::RhumbLine::GenPosition(), GeographicLib::Geoid::Geoid(), GeographicLib::Geohash::Reverse(), GeographicLib::TransverseMercator::Reverse(), GeographicLib::TransverseMercatorExact::Reverse(), and GeographicLib::UTMUPS::StandardZone().

td

constexpr int GeographicLib::Math::td = 2 * hd staticconstexpr

ds

constexpr int GeographicLib::Math::ds = dm * ms staticconstexpr

bigendian

true if the machine is big-endian.

Definition at line 193 of file Math.hpp.


The documentation for this class was generated from the following files: