std::atan2(std::valarray)
Определено в заголовке <valarray> | ||
|---|---|---|
template< class T > std::valarray<T> atan2( const std::valarray<T>& y, const std::valarray<T>& x ); | (1) | |
template< class T >
std::valarray<T> atan2( const std::valarray<T>& y,
const typename std::valarray<T>::value_type& vx );
| (2) | |
template< class T >
std::valarray<T> atan2( const typename std::valarray<T>::value_type& vy,
const std::valarray<T>& x );
| (3) |
Вычисляет обратную тангенс y / x, используя знаки аргументов для правильного определения квадранта.
y и x. Поведение неопределено, если x.size() != y.size().
vx и каждого значения в числовом массиве y. vy и каждого значения в числовом массиве x. Параметры
| x, y | - | числовые массивы для вычисления обратной тангенс |
| vy, vx | - | значения для вычисления обратной тангенс |
Возвращаемое значение
Числовой массив, содержащий результаты вычисления обратной тангенс.
Примечания
Для выполнения вычислений используется неуточнённая функция (atan2). Если такая функция недоступна, используется std::atan2 из-за поиска аргументов по зависимости (ADL).
Функция может быть реализована с типом возвращаемого значения, отличным от std::valarray. В этом случае тип замены имеет следующие свойства:
- Все const методы
std::valarrayдоступны. -
std::valarray,std::slice_array,std::gslice_array,std::mask_arrayиstd::indirect_arrayмогут быть созданы из типа замены. - Для каждой функции, принимающей const std::valarray<T>& кроме
begin()иend()(с C++11), будут добавлены аналогичные функции, принимающие типы замены; - Для каждой функции, принимающей два const std::valarray<T>& аргумента, будут добавлены аналогичные функции, принимающие все комбинации const std::valarray<T>& и типов замены.
- Тип возвращаемого значения не добавляет более двух уровней шаблона вложенности по сравнению с самым вложенным типом аргумента.
Пример
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <valarray>
void show(char const* title, const std::valarray<double>& va)
{
std::cout << title << ' ';
std::for_each(std::begin(va), std::end(va), [](const double x)
{
std::cout << ' ' << std::right << std::setw(4) << x << "°";
});
std::cout << '\n';
}
const double pi = std::acos(-1.0); // C++20: std::numbers::pi
int main()
{
auto degrees_to_radians = [](double const& x) { return (pi * x / 180); };
auto radians_to_degrees = [](double const& x) { return (180 * x / pi); };
const std::valarray<double> degrees{-90, -60, -45, -30, 0, 30, 45, 60, 90};
const std::valarray<double> radians = degrees.apply(degrees_to_radians);
const auto sin = std::sin(radians);
const auto cos = std::cos(radians);
show("(1)", std::atan2(sin, cos).apply(radians_to_degrees));
show("(2)", std::atan2(sin/cos, 1.0).apply(radians_to_degrees));
show("(3)", std::atan2(1.0, cos/sin).apply(radians_to_degrees));
}Вывод:
(1) -90° -60° -45° -30° 0° 30° 45° 60° 90° (2) -90° -60° -45° -30° 0° 30° 45° 60° 90° (3) 90° 120° 135° 150° 0° 30° 45° 60° 90°
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 3074 | C++98 |
T определяется как из скаляра, так и из valarray для (2,3), запрещая вызовы с разными типами | определяется только T из valarray |
См. также
применяет функцию std::asin к каждому элементу valarray (шаблон функции) |
|
применяет функцию std::acos к каждому элементу valarray (шаблон функции) |
|
применяет функцию std::atan к каждому элементу valarray (шаблон функции) |
|
|
(C++11)(C++11) | арктангенс, используя знаки для определения квадрантов (функция) |
| возвращает фазовый угол (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/valarray/atan2