atan2, atan2f, atan2l - cppreference.com (original) (raw)

Defined in header <math.h>
float atan2f( float y, float x ); (1) (since C99)
double atan2( double y, double x ); (2)
long double atan2l( long double y, long double x ); (3) (since C99)
_Decimal32 atan2d32( _Decimal32 y, _Decimal32 x ); (4) (since C23)
_Decimal64 atan2d64( _Decimal64 y, _Decimal64 x ); (5) (since C23)
_Decimal128 atan2d128( _Decimal128 y, _Decimal128 x ); (6) (since C23)
Defined in header <tgmath.h>
#define atan2( y, x ) (7) (since C99)

1-6) Computes the arc tangent of y / x using the signs of arguments to determine the correct quadrant.

  1. Type-generic macro: If any argument has type long double, (3) (atan2l) is called. Otherwise, if any argument has integer type or has type double, (2) (atan2) is called. Otherwise, (1) (atan2f) is called.
The functions (4-6) are declared if and only if the implementation predefines __STDC_IEC_60559_DFP__ (i.e. the implementation supports decimal floating-point numbers). (since C23)

Contents

[edit] Parameters

x, y - floating-point value

[edit] Return value

If no errors occur, the arc tangent of y / x (arctan()) in the range [-π ; +π] radians, is returned.

Y argument

Return value

math-atan2.png

X argument

If a domain error occurs, an implementation-defined value is returned.

If a range error occurs due to underflow, the correct result (after rounding) is returned.

[edit] Error handling

Errors are reported as specified in math_errhandling.

Domain error may occur if x and y are both zero.

If the implementation supports IEEE floating-point arithmetic (IEC 60559):

[edit] Notes

atan2(y, x) is equivalent to carg(x + I*y).

POSIX specifies that in case of underflow, y / x is the value returned, and if that is not supported, an implementation-defined value no greater than DBL_MIN, FLT_MIN, and LDBL_MIN is returned.

[edit] Example

#include <math.h> #include <stdio.h>   int main(void) { // normal usage: the signs of the two arguments determine the quadrant // atan2(1,1) = +pi/4, Quad I printf("(+1,+1) cartesian is (%f,%f) polar\n", hypot( 1, 1), atan2( 1, 1)); // atan2(1, -1) = +3pi/4, Quad II printf("(+1,-1) cartesian is (%f,%f) polar\n", hypot( 1,-1), atan2( 1,-1)); // atan2(-1,-1) = -3pi/4, Quad III printf("(-1,-1) cartesian is (%f,%f) polar\n", hypot(-1,-1), atan2(-1,-1)); // atan2(-1,-1) = -pi/4, Quad IV printf("(-1,+1) cartesian is (%f,%f) polar\n", hypot(-1, 1), atan2(-1, 1));   // special values printf("atan2(0, 0) = %f atan2(0, -0)=%f\n", atan2(0,0), atan2(0,-0.0)); printf("atan2(7, 0) = %f atan2(7, -0)=%f\n", atan2(7,0), atan2(7,-0.0)); }

Output:

(+1,+1) cartesian is (1.414214,0.785398) polar (+1,-1) cartesian is (1.414214,2.356194) polar (-1,-1) cartesian is (1.414214,-2.356194) polar (-1,+1) cartesian is (1.414214,-0.785398) polar atan2(0, 0) = 0.000000 atan2(0, -0)=3.141593 atan2(7, 0) = 1.570796 atan2(7, -0)=1.570796

[edit] References

[edit] See also