std::atan2, std::atan2f, std::atan2l
Определено в заголовке <cmath> | ||
|---|---|---|
| (1) | ||
float atan2 ( float y, float x ); double atan2 ( double y, double x ); long double atan2 ( long double y, long double x ); | (до 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) |
| Дополнительные перегрузки (с C++11) | ||
Определено в заголовке <cmath> | ||
template< class Integer > double atan2 ( Integer y, Integer x ); | (A) | (constexpr с C++26) |
y / x используя знаки аргументов для определения правильного квадранта. Библиотека предоставляет перегрузки std::atan2 для всех типов чисел с плавающей точкой без квалификаторов cv в качестве типа параметров.(с C++23)
| A) Дополнительные перегрузки предоставляются для всех целочисленных типов, которые обрабатываются как double. | (с C++11) |
Параметры
| y, x | - | значения с плавающей точкой или целые значения |
Возвращаемое значение
Если ошибок не произошло, возвращается арктангенсy / x (arctan(y/x)) в диапазоне [-π, +π] радиан. Если произошла ошибка области определения, возвращается определяемое реализацией значение (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/w/cpp/numeric/math/atan2