1994-08-19 09:40:01 +00:00
|
|
|
.\" Copyright (c) 1991 The Regents of the University of California.
|
|
|
|
.\" All rights reserved.
|
|
|
|
.\"
|
|
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
|
|
.\" modification, are permitted provided that the following conditions
|
|
|
|
.\" are met:
|
|
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
|
|
.\" documentation and/or other materials provided with the distribution.
|
2017-02-28 23:42:47 +00:00
|
|
|
.\" 3. Neither the name of the University nor the names of its contributors
|
1994-08-19 09:40:01 +00:00
|
|
|
.\" may be used to endorse or promote products derived from this software
|
|
|
|
.\" without specific prior written permission.
|
|
|
|
.\"
|
|
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
.\" SUCH DAMAGE.
|
|
|
|
.\"
|
|
|
|
.\" from: @(#)atan2.3 5.1 (Berkeley) 5/2/91
|
1999-08-28 00:22:10 +00:00
|
|
|
.\" $FreeBSD$
|
1994-08-19 09:40:01 +00:00
|
|
|
.\"
|
2008-07-31 22:41:26 +00:00
|
|
|
.Dd July 31, 2008
|
1994-08-19 09:40:01 +00:00
|
|
|
.Dt ATAN2 3
|
|
|
|
.Os
|
|
|
|
.Sh NAME
|
1995-03-01 05:06:48 +00:00
|
|
|
.Nm atan2 ,
|
2007-12-12 23:43:51 +00:00
|
|
|
.Nm atan2f ,
|
2008-07-31 22:41:26 +00:00
|
|
|
.Nm atan2l ,
|
2007-12-12 23:43:51 +00:00
|
|
|
.Nm carg ,
|
2008-07-31 22:41:26 +00:00
|
|
|
.Nm cargf ,
|
|
|
|
.Nm cargl
|
2007-12-12 23:43:51 +00:00
|
|
|
.Nd arc tangent and complex phase angle functions
|
2001-10-13 12:23:23 +00:00
|
|
|
.Sh LIBRARY
|
|
|
|
.Lb libm
|
1994-08-19 09:40:01 +00:00
|
|
|
.Sh SYNOPSIS
|
2001-10-01 16:09:29 +00:00
|
|
|
.In math.h
|
1994-08-19 09:40:01 +00:00
|
|
|
.Ft double
|
|
|
|
.Fn atan2 "double y" "double x"
|
1995-03-01 05:06:48 +00:00
|
|
|
.Ft float
|
|
|
|
.Fn atan2f "float y" "float x"
|
2008-07-31 22:41:26 +00:00
|
|
|
.Ft long double
|
|
|
|
.Fn atan2l "long double y" "long double x"
|
|
|
|
.In complex.h
|
2007-12-12 23:43:51 +00:00
|
|
|
.Ft double
|
|
|
|
.Fn carg "double complex z"
|
|
|
|
.Ft float
|
|
|
|
.Fn cargf "float complex z"
|
2008-07-31 22:41:26 +00:00
|
|
|
.Ft long double
|
|
|
|
.Fn cargl "long double complex z"
|
1994-08-19 09:40:01 +00:00
|
|
|
.Sh DESCRIPTION
|
|
|
|
The
|
2008-07-31 22:41:26 +00:00
|
|
|
.Fn atan2 ,
|
|
|
|
.Fn atan2f ,
|
|
|
|
and
|
|
|
|
.Fn atan2l
|
1995-03-01 05:06:48 +00:00
|
|
|
functions compute the principal value of the arc tangent of
|
|
|
|
.Fa y/ Ns Ar x ,
|
1994-08-19 09:40:01 +00:00
|
|
|
using the signs of both arguments to determine the quadrant of
|
|
|
|
the return value.
|
2007-12-12 23:43:51 +00:00
|
|
|
.Pp
|
|
|
|
The
|
2008-07-31 22:41:26 +00:00
|
|
|
.Fn carg ,
|
|
|
|
.Fn cargf ,
|
2007-12-12 23:43:51 +00:00
|
|
|
and
|
2008-07-31 22:41:26 +00:00
|
|
|
.Fn cargl
|
2007-12-12 23:43:51 +00:00
|
|
|
functions compute the complex argument (or phase angle) of
|
|
|
|
.Fa z .
|
2010-06-09 07:31:32 +00:00
|
|
|
The complex argument is the number theta such that
|
|
|
|
.Li z = r * e^(I * theta) ,
|
2007-12-12 23:43:51 +00:00
|
|
|
where
|
|
|
|
.Li r = cabs(z) .
|
|
|
|
The call
|
|
|
|
.Li carg(z)
|
|
|
|
is equivalent to
|
|
|
|
.Li atan2(cimag(z), creal(z)) ,
|
|
|
|
and similarly for
|
2008-07-31 22:41:26 +00:00
|
|
|
.Fn cargf
|
|
|
|
and
|
|
|
|
.Fn cargl .
|
1994-08-19 09:40:01 +00:00
|
|
|
.Sh RETURN VALUES
|
|
|
|
The
|
2008-07-31 22:41:26 +00:00
|
|
|
.Fn atan2 ,
|
|
|
|
.Fn atan2f ,
|
|
|
|
and
|
|
|
|
.Fn atan2l
|
1995-03-01 05:06:48 +00:00
|
|
|
functions, if successful,
|
2001-07-15 07:53:42 +00:00
|
|
|
return the arc tangent of
|
1995-03-01 05:06:48 +00:00
|
|
|
.Fa y/ Ns Ar x
|
1994-08-19 09:40:01 +00:00
|
|
|
in the range
|
|
|
|
.Bk -words
|
|
|
|
.Bq \&- Ns \*(Pi , \&+ Ns \*(Pi
|
|
|
|
.Ek
|
|
|
|
radians.
|
2005-01-14 23:28:28 +00:00
|
|
|
Here are some of the special cases:
|
1994-08-19 09:40:01 +00:00
|
|
|
.Bl -column atan_(y,x)_:=____ sign(y)_(Pi_atan2(Xy_xX))___
|
|
|
|
.It Fn atan2 y x No := Ta
|
|
|
|
.Fn atan y/x Ta
|
|
|
|
if
|
|
|
|
.Ar x
|
|
|
|
> 0,
|
|
|
|
.It Ta sign( Ns Ar y Ns )*(\*(Pi -
|
2010-06-02 10:20:38 +00:00
|
|
|
.Fn atan "\*(Bay/x\*(Ba" ) Ta
|
1994-08-19 09:40:01 +00:00
|
|
|
if
|
|
|
|
.Ar x
|
|
|
|
< 0,
|
|
|
|
.It Ta
|
|
|
|
.No 0 Ta
|
|
|
|
if x = y = 0, or
|
|
|
|
.It Ta
|
2010-06-02 10:20:38 +00:00
|
|
|
.Pf sign( Ar y Ns )*\*(Pi/2 Ta
|
1994-08-19 09:40:01 +00:00
|
|
|
if
|
|
|
|
.Ar x
|
2000-12-29 14:08:20 +00:00
|
|
|
= 0 \(!=
|
1994-08-19 09:40:01 +00:00
|
|
|
.Ar y .
|
|
|
|
.El
|
|
|
|
.Sh NOTES
|
|
|
|
The function
|
|
|
|
.Fn atan2
|
|
|
|
defines "if x > 0,"
|
|
|
|
.Fn atan2 0 0
|
2005-01-14 23:28:28 +00:00
|
|
|
= 0 despite that previously
|
1994-08-19 09:40:01 +00:00
|
|
|
.Fn atan2 0 0
|
|
|
|
may have generated an error message.
|
|
|
|
The reasons for assigning a value to
|
|
|
|
.Fn atan2 0 0
|
|
|
|
are these:
|
|
|
|
.Bl -enum -offset indent
|
|
|
|
.It
|
|
|
|
Programs that test arguments to avoid computing
|
|
|
|
.Fn atan2 0 0
|
|
|
|
must be indifferent to its value.
|
|
|
|
Programs that require it to be invalid are vulnerable
|
|
|
|
to diverse reactions to that invalidity on diverse computer systems.
|
|
|
|
.It
|
|
|
|
The
|
|
|
|
.Fn atan2
|
|
|
|
function is used mostly to convert from rectangular (x,y)
|
|
|
|
to polar
|
|
|
|
.if n\
|
|
|
|
(r,theta)
|
|
|
|
.if t\
|
|
|
|
(r,\(*h)
|
|
|
|
coordinates that must satisfy x =
|
|
|
|
.if n\
|
|
|
|
r\(**cos theta
|
|
|
|
.if t\
|
|
|
|
r\(**cos\(*h
|
|
|
|
and y =
|
|
|
|
.if n\
|
|
|
|
r\(**sin theta.
|
|
|
|
.if t\
|
|
|
|
r\(**sin\(*h.
|
|
|
|
These equations are satisfied when (x=0,y=0)
|
|
|
|
is mapped to
|
|
|
|
.if n \
|
2005-01-28 21:13:34 +00:00
|
|
|
(r=0,theta=0).
|
1994-08-19 09:40:01 +00:00
|
|
|
.if t \
|
2005-01-28 21:13:34 +00:00
|
|
|
(r=0,\(*h=0).
|
2004-07-02 23:52:20 +00:00
|
|
|
In general, conversions to polar coordinates
|
1994-08-19 09:40:01 +00:00
|
|
|
should be computed thus:
|
|
|
|
.Bd -unfilled -offset indent
|
|
|
|
.if n \{\
|
|
|
|
r := hypot(x,y); ... := sqrt(x\(**x+y\(**y)
|
|
|
|
theta := atan2(y,x).
|
|
|
|
.\}
|
|
|
|
.if t \{\
|
|
|
|
r := hypot(x,y); ... := \(sr(x\u\s82\s10\d+y\u\s82\s10\d)
|
|
|
|
\(*h := atan2(y,x).
|
|
|
|
.\}
|
|
|
|
.Ed
|
|
|
|
.It
|
|
|
|
The foregoing formulas need not be altered to cope in a
|
|
|
|
reasonable way with signed zeros and infinities
|
|
|
|
on a machine that conforms to
|
|
|
|
.Tn IEEE 754 ;
|
|
|
|
the versions of
|
|
|
|
.Xr hypot 3
|
|
|
|
and
|
|
|
|
.Fn atan2
|
|
|
|
provided for
|
|
|
|
such a machine are designed to handle all cases.
|
|
|
|
That is why
|
|
|
|
.Fn atan2 \(+-0 \-0
|
|
|
|
= \(+-\*(Pi
|
|
|
|
for instance.
|
|
|
|
In general the formulas above are equivalent to these:
|
|
|
|
.Bd -unfilled -offset indent
|
|
|
|
.if n \
|
|
|
|
r := sqrt(x\(**x+y\(**y); if r = 0 then x := copysign(1,x);
|
|
|
|
.if t \
|
|
|
|
r := \(sr(x\(**x+y\(**y);\0\0if r = 0 then x := copysign(1,x);
|
|
|
|
.Ed
|
|
|
|
.El
|
|
|
|
.Sh SEE ALSO
|
|
|
|
.Xr acos 3 ,
|
|
|
|
.Xr asin 3 ,
|
|
|
|
.Xr atan 3 ,
|
2007-12-12 23:43:51 +00:00
|
|
|
.Xr cabs 3 ,
|
1994-08-19 09:40:01 +00:00
|
|
|
.Xr cos 3 ,
|
|
|
|
.Xr cosh 3 ,
|
1996-12-23 23:09:55 +00:00
|
|
|
.Xr math 3 ,
|
1994-08-19 09:40:01 +00:00
|
|
|
.Xr sin 3 ,
|
|
|
|
.Xr sinh 3 ,
|
|
|
|
.Xr tan 3 ,
|
1996-12-23 23:09:55 +00:00
|
|
|
.Xr tanh 3
|
1994-08-19 09:40:01 +00:00
|
|
|
.Sh STANDARDS
|
|
|
|
The
|
2007-12-12 23:43:51 +00:00
|
|
|
.Fn atan2 ,
|
|
|
|
.Fn atan2f ,
|
2008-07-31 22:41:26 +00:00
|
|
|
.Fn atan2l ,
|
2007-12-12 23:43:51 +00:00
|
|
|
.Fn carg ,
|
2008-07-31 22:41:26 +00:00
|
|
|
.Fn cargf ,
|
2007-12-12 23:43:51 +00:00
|
|
|
and
|
2008-07-31 22:41:26 +00:00
|
|
|
.Fn cargl
|
2007-12-12 23:43:51 +00:00
|
|
|
functions conform to
|
2007-12-12 23:50:00 +00:00
|
|
|
.St -isoC-99 .
|