std:: atan2, std:: atan2f, std:: atan2l
|
Определено в заголовочном файле
<cmath>
|
||
| (1) | ||
|
float
atan2
(
float
y,
float
x
)
;
double
atan2
(
double
y,
double
x
)
;
|
(до C++23) | |
|
/*floating-point-type*/
atan2
(
/*floating-point-type*/
y,
|
(начиная с 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
>
|
(S) | (начиная с C++26) |
|
Дополнительные перегрузки
(начиная с C++11)
|
||
|
Определено в заголовочном файле
<cmath>
|
||
|
template
<
class
Integer
>
double atan2 ( Integer y, Integer x ) ; |
(A) | (constexpr начиная с C++26) |
std::atan2
для всех cv-неквалифицированных типов с плавающей точкой в качестве типа параметров.
(since C++23)
|
S)
SIMD перегрузка выполняет поэлементное вычисление
std::atan2
для
v_y
и
v_x
.
|
(since C++26) |
|
A)
Дополнительные перегрузки предоставляются для всех целочисленных типов, которые трактуются как
double
.
|
(since C++11) |
Содержание |
Параметры
| y, x | - | значения с плавающей точкой или целочисленные значения |
Возвращаемое значение
If no errors occur, the arc tangent of y / x ( arctan(| y |
| x |
Если происходит ошибка домена, возвращается значение, определяемое реализацией (NaN, если поддерживается).
Если происходит ошибка диапазона из-за потери значимости (underflow), возвращается корректный результат (после округления).
Обработка ошибок
Ошибки сообщаются, как указано в 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 является NaN, либо 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) |
|
Если
num1
и
num2
имеют арифметические типы, то
std
::
atan2
(
num1, num2
)
имеет тот же эффект, что и
std
::
atan2
(
static_cast
<
/*common-floating-point-type*/
>
(
num1
)
,
Если такой тип с плавающей запятой с наибольшим рангом и подрангом не существует, то разрешение перегрузки не приводит к пригодному кандидату из предоставленных перегрузок. |
(начиная с 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() { // нормальное использование: знаки двух аргументов определяют квадрант print_coordinates(+1, +1); // atan2( 1, 1) = +pi/4, I квадрант print_coordinates(-1, +1); // atan2( 1, -1) = +3pi/4, II квадрант print_coordinates(-1, -1); // atan2(-1, -1) = -3pi/4, III квадрант print_coordinates(+1, -1); // atan2(-1, 1) = -pi/4, IV квадрант // специальные значения 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)
|
вычисляет арксинус (
arcsin(x)
)
(функция) |
|
(C++11)
(C++11)
|
вычисляет арккосинус (
arccos(x)
)
(функция) |
|
(C++11)
(C++11)
|
вычисляет арктангенс (
arctan(x)
)
(функция) |
|
возвращает фазовый угол
(шаблон функции) |
|
|
применяет функцию
std::atan2
к valarray и значению
(шаблон функции) |
|
|
Документация C
для
atan2
|
|