std::atan2, std::atan2f, std::atan2l
Определён в заголовочном файле <cmath> | ||
|---|---|---|
float atan2 ( float y, float x ); double atan2 ( double y, double x ); long double atan2 ( long double y, long double x ); | (1) | (до C++23) |
/*floating-point-type*/
atan2 ( /*floating-point-type*/ y,
/*floating-point-type*/ x );
|
(начиная с C++23) (constexpr начиная с C++26) | |
float atan2f( float y, float x ); | (2) |
(начиная с C++11) (constexpr начиная с C++26) |
long double atan2l( long double y, long double x ); | (3) |
(начиная с C++11) (constexpr начиная с C++26) |
| Перегрузка SIMD (начиная с C++26) | ||
Определён в заголовочном файле <simd> | ||
template< class V0, class V1 >
constexpr /*math-common-simd-t*/<V0, V1>
atan2 ( const V0& v_y, const V1& v_x );
| (S) | (начиная с C++26) |
| Дополнительные перегрузки (начиная с C++11) | ||
Определён в заголовочном файле <cmath> | ||
template< class Integer > double atan2 ( Integer y, Integer x ); | (A) | (constexpr начиная с C++26) |
y / x, используя знаки аргументов для определения правильного квадранта. Библиотека предоставляет перегрузки std::atan2 для всех типов с плавающей точкой, не имеющих квалификаторов cv, в качестве типов параметров.(начиная с C++23)
S) Перегрузка SIMD выполняет поэлементное std::atan2 над v_yи v_x. (См. math-common-simd-t для определения.) | (начиная с C++26) |
| A) Предоставляются дополнительные перегрузки для всех целочисленных типов, которые рассматриваются как double. | (начиная с C++11) |
Параметры
| y, x | - | значения с плавающей точкой или целочисленные значения |
Возвращаемое значение
Если ошибок не возникает, возвращается арктангенс y / x (arctan(
) в диапазоне [-π, +π] радиан.
Если возникает ошибка области определения, возвращается значение, определяемое реализацией (NaN, если поддерживается).
Если из-за потери порядка возникает ошибка диапазона, возвращается правильный результат (после округления).
Обработка ошибок
Об ошибках сообщается в соответствии с math_errhandling.
Ошибка области определения может возникнуть, если x и y равны нулю.
Если реализация поддерживает арифметику с плавающей точкой IEEE (IEC 60559),
- Если
xиyравны нулю, ошибка области определения не возникает. - Если
xиyравны нулю, ошибка диапазона также не возникает. - Если
yравен нулю, ошибка полюса не возникает. - Если
yравен ±0, аxотрицателен или равен -0, возвращается ±π. - Если
yравен ±0, аxположителен или равен +0, возвращается ±0. - Если
yравен ±∞, аxконечен, возвращается ±π/2. - Если
yравен ±∞, аxравен -∞, возвращается ±3π/4. - Если
yравен ±∞, аxравен +∞, возвращается ±π/4. - Если
xравен ±0, аyотрицателен, возвращается -π/2. - Если
xравен ±0, аyположителен, возвращается +π/2. - Если
xравен -∞, аyконечен и положителен, возвращается +π. - Если
xравен -∞, аyконечен и отрицателен, возвращается -π. - Если
xравен +∞, аyконечен и положителен, возвращается +0. - Если
xравен +∞, аyконечен и отрицателен, возвращается -0. - Если
xилиyявляется NaN, возвращается NaN.
Примечания
std::atan2(y, x) эквивалентно std::arg(std::complex<std::common_type_t<decltype(x), decltype(y)>>(x, y)).
В POSIX указано, что в случае потери порядка возвращается значение y / x, а если оно не поддерживается — значение, определяемое реализацией, не превышающее DBL_MIN, FLT_MIN и LDBL_MIN.
Дополнительные перегрузки не обязательно должны быть предоставлены точно в виде (A). Они должны лишь обеспечивать, чтобы для первого аргумента num1 и второго аргумента num2:
| (до C++23) |
| Если Если такого типа с плавающей точкой с наибольшими рангом и подрангом не существует, то разрешение перегрузки не приводит к появлению пригодного кандидата среди предоставленных перегрузок. | (начиная с C++23) |
Пример
#include <cmath>
#include <iostream>
void print_coordinates(int x, int y)
{
std::cout << std::showpos
<< "(x:" << x << ", y:" << y << ") cartesian is "
<< "(r:" << std::hypot(x, y)
<< ", phi:" << std::atan2(y, x) << ") polar\n";
}
int main()
{
// normal usage: the signs of the two arguments determine the quadrant
print_coordinates(+1, +1); // atan2( 1, 1) = +pi/4, Quad I
print_coordinates(-1, +1); // atan2( 1, -1) = +3pi/4, Quad II
print_coordinates(-1, -1); // atan2(-1, -1) = -3pi/4, Quad III
print_coordinates(+1, -1); // atan2(-1, 1) = -pi/4, Quad IV
// special values
std::cout << std::noshowpos
<< "atan2(0, 0) = " << atan2(0, 0) << '\n'
<< "atan2(0,-0) = " << atan2(0, -0.0) << '\n'
<< "atan2(7, 0) = " << atan2(7, 0) << '\n'
<< "atan2(7,-0) = " << atan2(7, -0.0) << '\n';
}
Вывод:
(x:+1, y:+1) cartesian is (r:1.41421, phi:0.785398) polar (x:-1, y:+1) cartesian is (r:1.41421, phi:2.35619) polar (x:-1, y:-1) cartesian is (r:1.41421, phi:-2.35619) polar (x:+1, y:-1) cartesian is (r:1.41421, phi:-0.785398) polar atan2(0, 0) = 0 atan2(0,-0) = 3.14159 atan2(7, 0) = 1.5708 atan2(7,-0) = 1.5708
См. также
|
(C++11)(C++11) | вычисляет арксинус (\({\small\arcsin{x}}\)arcsin(x)) (функция) |
|
(C++11)(C++11) | вычисляет арккосинус (\({\small\arccos{x}}\)arccos(x)) (функция) |
|
(C++11)(C++11) | вычисляет арктангенс (\({\small\arctan{x}}\)arctan(x)) (функция) |
| возвращает фазовый угол (шаблон функции) |
|
применяет функцию std::atan2 к valarray и значению (шаблон функции) |
|
Документация по C для atan2 |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/math/atan2