Updated: April 19, 2023 |

*Compute the arctangent, determining the quadrant*

#include <math.h> double atan2( doubley, doublex); float atan2f( floaty, floatx); long double atan2l( long doubley, long doublex);

`y`,`x`- The value (
`y`/`x`) for which you want to find the angle.

- libm
- The general-purpose math library.
- libm-sve
- (QNX Neutrino 7.1 or later) A library that optimizes the code for ARMv8.2 chips that have Scalable Vector Extension hardware.

Your system requirements will determine how you should work with these libraries:

- If you want only selected processes to run with the SVE version, you can include both libraries in your OS image and use the -l m or -l m-sve option to qcc to link explicitly against the appropriate one.
- If you want all processes to use the SVE version, include libm-sve.so in your OS image and set up a symbolic link from libm.so to libm-sve.so. Use the -l m option to qcc to link against the library.

Note:
Compile your program with the -fno-builtin option to prevent the compiler from using a
built-in version of the function.

These functions compute the value of the
arctangent (in radians) of `y`/`x`,
using the signs of both arguments
to determine the quadrant of the return value.
No errors occur if both arguments are zero, or if `y` is zero.

To check for error situations, use feclearexcept() and fetestexcept(). For example:

- Call
`feclearexcept(FE_ALL_EXCEPT)`before calling atan2(), atan2f(), or atan2l(). - On return, if
`fetestexcept(FE_ALL_EXCEPT)`is nonzero, then an error has occurred.

The arctangent of `y/x`, in the range [-`π`, `π`].

If y is: |
And x is: |
These functions return: | Errors: |
---|---|---|---|

±0.0 | Negative or -0.0 | π, with the same sign as y (see below) |
— |

±0.0 | Positive or +0.0 | 0.0 (see below) | — |

±Inf | Finite | π/2, with the same sign as y |
— |

±Inf | -Inf | 3π/4, with the same sign as y |
— |

±Inf | Inf | π/4, with the same sign as y |
— |

Negative | ±0.0 | -π/2 |
— |

Positive | ±0.0 | +π/2 |
— |

Finite and positive | -Inf | +π |
— |

Finite and negative | -Inf | -π |
— |

Finite and positive | Inf | 0.0 | — |

Finite and negative | Inf | -0.0 | — |

Any value | NaN | x |
— |

NaN | Any value | y |
— |

Note:
Although the library considers 0.0 to be equal to -0.0, `atan2(0.0, 0.0)` isn't equal to
`atan2(0.0, -0.0)`.

These functions raise FE_INEXACT if the FPU reports that the result can't be exactly represented as a floating-point number.

#include <stdio.h> #include <math.h> #include <fenv.h> #include <stdlib.h> int main( void ) { int except_flags; feclearexcept(FE_ALL_EXCEPT); printf( "%f\n", atan2( .5, 1. ) ); except_flags = fetestexcept(FE_ALL_EXCEPT); if(except_flags) { /* An error occurred; handle it appropriately. */ } return EXIT_SUCCESS; }

produces the output:

0.463648

Safety: | |
---|---|

Cancellation point | No |

Interrupt handler | Yes |

Signal handler | Yes |

Thread | Yes |