summaryrefslogtreecommitdiffstats
path: root/upstream/debian-unstable/man3/Math::Trig.3perl
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
commitfc22b3d6507c6745911b9dfcc68f1e665ae13dbc (patch)
treece1e3bce06471410239a6f41282e328770aa404a /upstream/debian-unstable/man3/Math::Trig.3perl
parentInitial commit. (diff)
downloadmanpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.tar.xz
manpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.zip
Adding upstream version 4.22.0.upstream/4.22.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'upstream/debian-unstable/man3/Math::Trig.3perl')
-rw-r--r--upstream/debian-unstable/man3/Math::Trig.3perl611
1 files changed, 611 insertions, 0 deletions
diff --git a/upstream/debian-unstable/man3/Math::Trig.3perl b/upstream/debian-unstable/man3/Math::Trig.3perl
new file mode 100644
index 00000000..69fc6095
--- /dev/null
+++ b/upstream/debian-unstable/man3/Math::Trig.3perl
@@ -0,0 +1,611 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "Math::Trig 3perl"
+.TH Math::Trig 3perl 2024-01-12 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+Math::Trig \- trigonometric functions
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+.Vb 1
+\& use Math::Trig;
+\&
+\& $x = tan(0.9);
+\& $y = acos(3.7);
+\& $z = asin(2.4);
+\&
+\& $halfpi = pi/2;
+\&
+\& $rad = deg2rad(120);
+\&
+\& # Import constants pi2, pi4, pip2, pip4 (2*pi, 4*pi, pi/2, pi/4).
+\& use Math::Trig \*(Aq:pi\*(Aq;
+\&
+\& # Import the conversions between cartesian/spherical/cylindrical.
+\& use Math::Trig \*(Aq:radial\*(Aq;
+\&
+\& # Import the great circle formulas.
+\& use Math::Trig \*(Aq:great_circle\*(Aq;
+.Ve
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+\&\f(CW\*(C`Math::Trig\*(C'\fR defines many trigonometric functions not defined by the
+core Perl which defines only the \f(CWsin()\fR and \f(CWcos()\fR. The constant
+\&\fBpi\fR is also defined as are a few convenience functions for angle
+conversions, and \fIgreat circle formulas\fR for spherical movement.
+.SH ANGLES
+.IX Header "ANGLES"
+All angles are defined in radians, except where otherwise specified
+(for example in the deg/rad conversion functions).
+.SH "TRIGONOMETRIC FUNCTIONS"
+.IX Header "TRIGONOMETRIC FUNCTIONS"
+The tangent
+.IP \fBtan\fR 4
+.IX Item "tan"
+.PP
+The cofunctions of the sine, cosine, and tangent (cosec/csc and cotan/cot
+are aliases)
+.PP
+\&\fBcsc\fR, \fBcosec\fR, \fBsec\fR, \fBsec\fR, \fBcot\fR, \fBcotan\fR
+.PP
+The arcus (also known as the inverse) functions of the sine, cosine,
+and tangent
+.PP
+\&\fBasin\fR, \fBacos\fR, \fBatan\fR
+.PP
+The principal value of the arc tangent of y/x
+.PP
+\&\fBatan2\fR(y, x)
+.PP
+The arcus cofunctions of the sine, cosine, and tangent (acosec/acsc
+and acotan/acot are aliases). Note that atan2(0, 0) is not well-defined.
+.PP
+\&\fBacsc\fR, \fBacosec\fR, \fBasec\fR, \fBacot\fR, \fBacotan\fR
+.PP
+The hyperbolic sine, cosine, and tangent
+.PP
+\&\fBsinh\fR, \fBcosh\fR, \fBtanh\fR
+.PP
+The cofunctions of the hyperbolic sine, cosine, and tangent (cosech/csch
+and cotanh/coth are aliases)
+.PP
+\&\fBcsch\fR, \fBcosech\fR, \fBsech\fR, \fBcoth\fR, \fBcotanh\fR
+.PP
+The area (also known as the inverse) functions of the hyperbolic
+sine, cosine, and tangent
+.PP
+\&\fBasinh\fR, \fBacosh\fR, \fBatanh\fR
+.PP
+The area cofunctions of the hyperbolic sine, cosine, and tangent
+(acsch/acosech and acoth/acotanh are aliases)
+.PP
+\&\fBacsch\fR, \fBacosech\fR, \fBasech\fR, \fBacoth\fR, \fBacotanh\fR
+.PP
+The trigonometric constant \fBpi\fR and some of handy multiples
+of it are also defined.
+.PP
+\&\fBpi, pi2, pi4, pip2, pip4\fR
+.SS "ERRORS DUE TO DIVISION BY ZERO"
+.IX Subsection "ERRORS DUE TO DIVISION BY ZERO"
+The following functions
+.PP
+.Vb 10
+\& acoth
+\& acsc
+\& acsch
+\& asec
+\& asech
+\& atanh
+\& cot
+\& coth
+\& csc
+\& csch
+\& sec
+\& sech
+\& tan
+\& tanh
+.Ve
+.PP
+cannot be computed for all arguments because that would mean dividing
+by zero or taking logarithm of zero. These situations cause fatal
+runtime errors looking like this
+.PP
+.Vb 3
+\& cot(0): Division by zero.
+\& (Because in the definition of cot(0), the divisor sin(0) is 0)
+\& Died at ...
+.Ve
+.PP
+or
+.PP
+.Vb 2
+\& atanh(\-1): Logarithm of zero.
+\& Died at...
+.Ve
+.PP
+For the \f(CW\*(C`csc\*(C'\fR, \f(CW\*(C`cot\*(C'\fR, \f(CW\*(C`asec\*(C'\fR, \f(CW\*(C`acsc\*(C'\fR, \f(CW\*(C`acot\*(C'\fR, \f(CW\*(C`csch\*(C'\fR, \f(CW\*(C`coth\*(C'\fR,
+\&\f(CW\*(C`asech\*(C'\fR, \f(CW\*(C`acsch\*(C'\fR, the argument cannot be \f(CW0\fR (zero). For the
+\&\f(CW\*(C`atanh\*(C'\fR, \f(CW\*(C`acoth\*(C'\fR, the argument cannot be \f(CW1\fR (one). For the
+\&\f(CW\*(C`atanh\*(C'\fR, \f(CW\*(C`acoth\*(C'\fR, the argument cannot be \f(CW\-1\fR (minus one). For the
+\&\f(CW\*(C`tan\*(C'\fR, \f(CW\*(C`sec\*(C'\fR, \f(CW\*(C`tanh\*(C'\fR, \f(CW\*(C`sech\*(C'\fR, the argument cannot be \fIpi/2 + k *
+pi\fR, where \fIk\fR is any integer.
+.PP
+Note that atan2(0, 0) is not well-defined.
+.SS "SIMPLE (REAL) ARGUMENTS, COMPLEX RESULTS"
+.IX Subsection "SIMPLE (REAL) ARGUMENTS, COMPLEX RESULTS"
+Please note that some of the trigonometric functions can break out
+from the \fBreal axis\fR into the \fBcomplex plane\fR. For example
+\&\f(CWasin(2)\fR has no definition for plain real numbers but it has
+definition for complex numbers.
+.PP
+In Perl terms this means that supplying the usual Perl numbers (also
+known as scalars, please see perldata) as input for the
+trigonometric functions might produce as output results that no more
+are simple real numbers: instead they are complex numbers.
+.PP
+The \f(CW\*(C`Math::Trig\*(C'\fR handles this by using the \f(CW\*(C`Math::Complex\*(C'\fR package
+which knows how to handle complex numbers, please see Math::Complex
+for more information. In practice you need not to worry about getting
+complex numbers as results because the \f(CW\*(C`Math::Complex\*(C'\fR takes care of
+details like for example how to display complex numbers. For example:
+.PP
+.Vb 1
+\& print asin(2), "\en";
+.Ve
+.PP
+should produce something like this (take or leave few last decimals):
+.PP
+.Vb 1
+\& 1.5707963267949\-1.31695789692482i
+.Ve
+.PP
+That is, a complex number with the real part of approximately \f(CW1.571\fR
+and the imaginary part of approximately \f(CW\-1.317\fR.
+.SH "PLANE ANGLE CONVERSIONS"
+.IX Header "PLANE ANGLE CONVERSIONS"
+(Plane, 2\-dimensional) angles may be converted with the following functions.
+.IP deg2rad 4
+.IX Item "deg2rad"
+.Vb 1
+\& $radians = deg2rad($degrees);
+.Ve
+.IP grad2rad 4
+.IX Item "grad2rad"
+.Vb 1
+\& $radians = grad2rad($gradians);
+.Ve
+.IP rad2deg 4
+.IX Item "rad2deg"
+.Vb 1
+\& $degrees = rad2deg($radians);
+.Ve
+.IP grad2deg 4
+.IX Item "grad2deg"
+.Vb 1
+\& $degrees = grad2deg($gradians);
+.Ve
+.IP deg2grad 4
+.IX Item "deg2grad"
+.Vb 1
+\& $gradians = deg2grad($degrees);
+.Ve
+.IP rad2grad 4
+.IX Item "rad2grad"
+.Vb 1
+\& $gradians = rad2grad($radians);
+.Ve
+.PP
+The full circle is 2 \fIpi\fR radians or \fI360\fR degrees or \fI400\fR gradians.
+The result is by default wrapped to be inside the [0, {2pi,360,400}] circle.
+If you don't want this, supply a true second argument:
+.PP
+.Vb 2
+\& $zillions_of_radians = deg2rad($zillions_of_degrees, 1);
+\& $negative_degrees = rad2deg($negative_radians, 1);
+.Ve
+.PP
+You can also do the wrapping explicitly by \fBrad2rad()\fR, \fBdeg2deg()\fR, and
+\&\fBgrad2grad()\fR.
+.IP rad2rad 4
+.IX Item "rad2rad"
+.Vb 1
+\& $radians_wrapped_by_2pi = rad2rad($radians);
+.Ve
+.IP deg2deg 4
+.IX Item "deg2deg"
+.Vb 1
+\& $degrees_wrapped_by_360 = deg2deg($degrees);
+.Ve
+.IP grad2grad 4
+.IX Item "grad2grad"
+.Vb 1
+\& $gradians_wrapped_by_400 = grad2grad($gradians);
+.Ve
+.SH "RADIAL COORDINATE CONVERSIONS"
+.IX Header "RADIAL COORDINATE CONVERSIONS"
+\&\fBRadial coordinate systems\fR are the \fBspherical\fR and the \fBcylindrical\fR
+systems, explained shortly in more detail.
+.PP
+You can import radial coordinate conversion functions by using the
+\&\f(CW\*(C`:radial\*(C'\fR tag:
+.PP
+.Vb 1
+\& use Math::Trig \*(Aq:radial\*(Aq;
+\&
+\& ($rho, $theta, $z) = cartesian_to_cylindrical($x, $y, $z);
+\& ($rho, $theta, $phi) = cartesian_to_spherical($x, $y, $z);
+\& ($x, $y, $z) = cylindrical_to_cartesian($rho, $theta, $z);
+\& ($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z);
+\& ($x, $y, $z) = spherical_to_cartesian($rho, $theta, $phi);
+\& ($rho_c, $theta, $z) = spherical_to_cylindrical($rho_s, $theta, $phi);
+.Ve
+.PP
+\&\fBAll angles are in radians\fR.
+.SS "COORDINATE SYSTEMS"
+.IX Subsection "COORDINATE SYSTEMS"
+\&\fBCartesian\fR coordinates are the usual rectangular \fI(x, y, z)\fR\-coordinates.
+.PP
+Spherical coordinates, \fI(rho, theta, phi)\fR, are three-dimensional
+coordinates which define a point in three-dimensional space. They are
+based on a sphere surface. The radius of the sphere is \fBrho\fR, also
+known as the \fIradial\fR coordinate. The angle in the \fIxy\fR\-plane
+(around the \fIz\fR\-axis) is \fBtheta\fR, also known as the \fIazimuthal\fR
+coordinate. The angle from the \fIz\fR\-axis is \fBphi\fR, also known as the
+\&\fIpolar\fR coordinate. The North Pole is therefore \fIrho, 0, 0\fR, and
+the Gulf of Guinea (think of the missing big chunk of Africa) \fIrho,
+0, pi/2\fR. In geographical terms \fIphi\fR is latitude (northward
+positive, southward negative) and \fItheta\fR is longitude (eastward
+positive, westward negative).
+.PP
+\&\fBBEWARE\fR: some texts define \fItheta\fR and \fIphi\fR the other way round,
+some texts define the \fIphi\fR to start from the horizontal plane, some
+texts use \fIr\fR in place of \fIrho\fR.
+.PP
+Cylindrical coordinates, \fI(rho, theta, z)\fR, are three-dimensional
+coordinates which define a point in three-dimensional space. They are
+based on a cylinder surface. The radius of the cylinder is \fBrho\fR,
+also known as the \fIradial\fR coordinate. The angle in the \fIxy\fR\-plane
+(around the \fIz\fR\-axis) is \fBtheta\fR, also known as the \fIazimuthal\fR
+coordinate. The third coordinate is the \fIz\fR, pointing up from the
+\&\fBtheta\fR\-plane.
+.SS "3\-D ANGLE CONVERSIONS"
+.IX Subsection "3-D ANGLE CONVERSIONS"
+Conversions to and from spherical and cylindrical coordinates are
+available. Please notice that the conversions are not necessarily
+reversible because of the equalities like \fIpi\fR angles being equal to
+\&\fI\-pi\fR angles.
+.IP cartesian_to_cylindrical 4
+.IX Item "cartesian_to_cylindrical"
+.Vb 1
+\& ($rho, $theta, $z) = cartesian_to_cylindrical($x, $y, $z);
+.Ve
+.IP cartesian_to_spherical 4
+.IX Item "cartesian_to_spherical"
+.Vb 1
+\& ($rho, $theta, $phi) = cartesian_to_spherical($x, $y, $z);
+.Ve
+.IP cylindrical_to_cartesian 4
+.IX Item "cylindrical_to_cartesian"
+.Vb 1
+\& ($x, $y, $z) = cylindrical_to_cartesian($rho, $theta, $z);
+.Ve
+.IP cylindrical_to_spherical 4
+.IX Item "cylindrical_to_spherical"
+.Vb 1
+\& ($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z);
+.Ve
+.Sp
+Notice that when \f(CW$z\fR is not 0 \f(CW$rho_s\fR is not equal to \f(CW$rho_c\fR.
+.IP spherical_to_cartesian 4
+.IX Item "spherical_to_cartesian"
+.Vb 1
+\& ($x, $y, $z) = spherical_to_cartesian($rho, $theta, $phi);
+.Ve
+.IP spherical_to_cylindrical 4
+.IX Item "spherical_to_cylindrical"
+.Vb 1
+\& ($rho_c, $theta, $z) = spherical_to_cylindrical($rho_s, $theta, $phi);
+.Ve
+.Sp
+Notice that when \f(CW$z\fR is not 0 \f(CW$rho_c\fR is not equal to \f(CW$rho_s\fR.
+.SH "GREAT CIRCLE DISTANCES AND DIRECTIONS"
+.IX Header "GREAT CIRCLE DISTANCES AND DIRECTIONS"
+A great circle is section of a circle that contains the circle
+diameter: the shortest distance between two (non-antipodal) points on
+the spherical surface goes along the great circle connecting those two
+points.
+.SS great_circle_distance
+.IX Subsection "great_circle_distance"
+Returns the great circle distance between two points on a sphere.
+.PP
+.Vb 1
+\& $distance = great_circle_distance($theta0, $phi0, $theta1, $phi1, [, $rho]);
+.Ve
+.PP
+Where ($theta0, \f(CW$phi0\fR) and ($theta1, \f(CW$phi1\fR) are the spherical coordinates of
+the two points, respectively. The distance is in \f(CW$rho\fR units. The \f(CW$rho\fR
+is optional. It defaults to 1 (the unit sphere).
+.PP
+If you are using geographic coordinates, latitude and longitude, you need to
+adjust for the fact that latitude is zero at the equator increasing towards
+the north and decreasing towards the south. Assuming ($lat0, \f(CW$lon0\fR) and
+($lat1, \f(CW$lon1\fR) are the geographic coordinates in radians of the two points,
+the distance can be computed with
+.PP
+.Vb 2
+\& $distance = great_circle_distance($lon0, pi/2 \- $lat0,
+\& $lon1, pi/2 \- $lat1, $rho);
+.Ve
+.SS great_circle_direction
+.IX Subsection "great_circle_direction"
+The direction you must follow the great circle (also known as \fIbearing\fR)
+can be computed by the \fBgreat_circle_direction()\fR function:
+.PP
+.Vb 1
+\& use Math::Trig \*(Aqgreat_circle_direction\*(Aq;
+\&
+\& $direction = great_circle_direction($theta0, $phi0, $theta1, $phi1);
+.Ve
+.SS great_circle_bearing
+.IX Subsection "great_circle_bearing"
+Alias 'great_circle_bearing' for 'great_circle_direction' is also available.
+.PP
+.Vb 1
+\& use Math::Trig \*(Aqgreat_circle_bearing\*(Aq;
+\&
+\& $direction = great_circle_bearing($theta0, $phi0, $theta1, $phi1);
+.Ve
+.PP
+The result of great_circle_direction is in radians, zero indicating
+straight north, pi or \-pi straight south, pi/2 straight west, and
+\&\-pi/2 straight east.
+.SS great_circle_destination
+.IX Subsection "great_circle_destination"
+You can inversely compute the destination if you know the
+starting point, direction, and distance:
+.PP
+.Vb 1
+\& use Math::Trig \*(Aqgreat_circle_destination\*(Aq;
+\&
+\& # $diro is the original direction,
+\& # for example from great_circle_bearing().
+\& # $distance is the angular distance in radians,
+\& # for example from great_circle_distance().
+\& # $thetad and $phid are the destination coordinates,
+\& # $dird is the final direction at the destination.
+\&
+\& ($thetad, $phid, $dird) =
+\& great_circle_destination($theta, $phi, $diro, $distance);
+.Ve
+.PP
+or the midpoint if you know the end points:
+.SS great_circle_midpoint
+.IX Subsection "great_circle_midpoint"
+.Vb 1
+\& use Math::Trig \*(Aqgreat_circle_midpoint\*(Aq;
+\&
+\& ($thetam, $phim) =
+\& great_circle_midpoint($theta0, $phi0, $theta1, $phi1);
+.Ve
+.PP
+The \fBgreat_circle_midpoint()\fR is just a special case (with \f(CW$way\fR = 0.5) of
+.SS great_circle_waypoint
+.IX Subsection "great_circle_waypoint"
+.Vb 1
+\& use Math::Trig \*(Aqgreat_circle_waypoint\*(Aq;
+\&
+\& ($thetai, $phii) =
+\& great_circle_waypoint($theta0, $phi0, $theta1, $phi1, $way);
+.Ve
+.PP
+Where \f(CW$way\fR indicates the position of the waypoint along the great
+circle arc through the starting point ($theta0, \f(CW$phi0\fR) and the end
+point ($theta1, \f(CW$phi1\fR) relative to the distance from the starting
+point to the end point. So \f(CW$way\fR = 0 gives the starting point, \f(CW$way\fR = 1
+gives the end point, \f(CW$way\fR < 0 gives a point "behind" the starting
+point, and \f(CW$way\fR > 1 gives a point beyond the end point. \f(CW$way\fR defaults
+to 0.5 if not given.
+.PP
+Note that antipodal points (where their distance is \fIpi\fR radians) do
+not have unique waypoints between them, and therefore \f(CW\*(C`undef\*(C'\fR is
+returned in such cases. If the points are the same, so the distance
+between them is zero, all waypoints are identical to the starting/end
+point.
+.PP
+The thetas, phis, direction, and distance in the above are all in
+radians.
+.PP
+You can import all the great circle formulas by
+.PP
+.Vb 1
+\& use Math::Trig \*(Aq:great_circle\*(Aq;
+.Ve
+.PP
+Notice that the resulting directions might be somewhat surprising if
+you are looking at a flat worldmap: in such map projections the great
+circles quite often do not look like the shortest routes \-\- but for
+example the shortest possible routes from Europe or North America to
+Asia do often cross the polar regions. (The common Mercator projection
+does \fBnot\fR show great circles as straight lines: straight lines in the
+Mercator projection are lines of constant bearing.)
+.SH EXAMPLES
+.IX Header "EXAMPLES"
+To calculate the distance between London (51.3N 0.5W) and Tokyo
+(35.7N 139.8E) in kilometers:
+.PP
+.Vb 1
+\& use Math::Trig qw(great_circle_distance deg2rad);
+\&
+\& # Notice the 90 \- latitude: phi zero is at the North Pole.
+\& sub NESW { deg2rad($_[0]), deg2rad(90 \- $_[1]) }
+\& my @L = NESW( \-0.5, 51.3);
+\& my @T = NESW(139.8, 35.7);
+\& my $km = great_circle_distance(@L, @T, 6378); # About 9600 km.
+.Ve
+.PP
+The direction you would have to go from London to Tokyo (in radians,
+straight north being zero, straight east being pi/2).
+.PP
+.Vb 1
+\& use Math::Trig qw(great_circle_direction);
+\&
+\& my $rad = great_circle_direction(@L, @T); # About 0.547 or 0.174 pi.
+.Ve
+.PP
+The midpoint between London and Tokyo being
+.PP
+.Vb 1
+\& use Math::Trig qw(great_circle_midpoint rad2deg);
+\&
+\& my @M = great_circle_midpoint(@L, @T);
+\& sub SWNE { rad2deg( $_[0] ), 90 \- rad2deg( $_[1] ) }
+\& my @lonlat = SWNE(@M);
+.Ve
+.PP
+or about 69 N 89 E, on the Putorana Plateau of Siberia.
+.PP
+\&\fBNOTE\fR: you \fBcannot\fR get from A to B like this:
+.PP
+.Vb 3
+\& Dist = great_circle_distance(A, B)
+\& Dir = great_circle_direction(A, B)
+\& C = great_circle_destination(A, Dist, Dir)
+.Ve
+.PP
+and expect C to be B, because the bearing constantly changes when
+going from A to B (except in some special case like the meridians or
+the circles of latitudes) and in \fBgreat_circle_destination()\fR one gives
+a \fBconstant\fR bearing to follow.
+.SS "CAVEAT FOR GREAT CIRCLE FORMULAS"
+.IX Subsection "CAVEAT FOR GREAT CIRCLE FORMULAS"
+The answers may be off by few percentages because of the irregular
+(slightly aspherical) form of the Earth. The errors are at worst
+about 0.55%, but generally below 0.3%.
+.SS "Real-valued asin and acos"
+.IX Subsection "Real-valued asin and acos"
+For small inputs \fBasin()\fR and \fBacos()\fR may return complex numbers even
+when real numbers would be enough and correct, this happens because of
+floating-point inaccuracies. You can see these inaccuracies for
+example by trying theses:
+.PP
+.Vb 2
+\& print cos(1e\-6)**2+sin(1e\-6)**2 \- 1,"\en";
+\& printf "%.20f", cos(1e\-6)**2+sin(1e\-6)**2,"\en";
+.Ve
+.PP
+which will print something like this
+.PP
+.Vb 2
+\& \-1.11022302462516e\-16
+\& 0.99999999999999988898
+.Ve
+.PP
+even though the expected results are of course exactly zero and one.
+The formulas used to compute \fBasin()\fR and \fBacos()\fR are quite sensitive to
+this, and therefore they might accidentally slip into the complex
+plane even when they should not. To counter this there are two
+interfaces that are guaranteed to return a real-valued output.
+.IP asin_real 4
+.IX Item "asin_real"
+.Vb 1
+\& use Math::Trig qw(asin_real);
+\&
+\& $real_angle = asin_real($input_sin);
+.Ve
+.Sp
+Return a real-valued arcus sine if the input is between [\-1, 1],
+\&\fBinclusive\fR the endpoints. For inputs greater than one, pi/2
+is returned. For inputs less than minus one, \-pi/2 is returned.
+.IP acos_real 4
+.IX Item "acos_real"
+.Vb 1
+\& use Math::Trig qw(acos_real);
+\&
+\& $real_angle = acos_real($input_cos);
+.Ve
+.Sp
+Return a real-valued arcus cosine if the input is between [\-1, 1],
+\&\fBinclusive\fR the endpoints. For inputs greater than one, zero
+is returned. For inputs less than minus one, pi is returned.
+.SH BUGS
+.IX Header "BUGS"
+Saying \f(CW\*(C`use Math::Trig;\*(C'\fR exports many mathematical routines in the
+caller environment and even overrides some (\f(CW\*(C`sin\*(C'\fR, \f(CW\*(C`cos\*(C'\fR). This is
+construed as a feature by the Authors, actually... ;\-)
+.PP
+The code is not optimized for speed, especially because we use
+\&\f(CW\*(C`Math::Complex\*(C'\fR and thus go quite near complex numbers while doing
+the computations even when the arguments are not. This, however,
+cannot be completely avoided if we want things like \f(CWasin(2)\fR to give
+an answer instead of giving a fatal runtime error.
+.PP
+Do not attempt navigation using these formulas.
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+Math::Complex
+.SH AUTHORS
+.IX Header "AUTHORS"
+Jarkko Hietaniemi <\fIjhi!at!iki.fi\fR>,
+Raphael Manfredi <\fIRaphael_Manfredi!at!pobox.com\fR>,
+Zefram <zefram@fysh.org>
+.SH LICENSE
+.IX Header "LICENSE"
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.