std:: hypot, std:: hypotf, std:: hypotl
|
Определено в заголовке
<cmath>
|
||
| (1) | ||
|
float
hypot
(
float
x,
float
y
)
;
double
hypot
(
double
x,
double
y
)
;
|
(начиная с C++11)
(до C++23) |
|
|
/*floating-point-type*/
hypot
(
/*floating-point-type*/
x,
|
(начиная с C++23)
(constexpr начиная с C++26) |
|
|
float
hypotf
(
float
x,
float
y
)
;
|
(2) |
(начиная с C++11)
(constexpr начиная с C++26) |
|
long
double
hypotl
(
long
double
x,
long
double
y
)
;
|
(3) |
(начиная с C++11)
(constexpr начиная с C++26) |
| (4) | ||
|
float
hypot
(
float
x,
float
y,
float
z
)
;
double
hypot
(
double
x,
double
y,
double
z
)
;
|
(начиная с C++17)
(до C++23) |
|
|
/*floating-point-type*/
hypot
(
/*floating-point-type*/
x,
|
(начиная с C++23)
(constexpr начиная с C++26) |
|
|
Определено в заголовке
<cmath>
|
||
|
template
<
class
Arithmetic1, Arithmetic2
>
/*common-floating-point-type*/
|
(A) |
(начиная с C++11)
(constexpr начиная с C++26) |
|
template
<
class
Arithmetic1, Arithmetic2, Arithmetic3
>
/*common-floating-point-type*/
|
(B) | (начиная с C++17) |
std::hypot
для всех неквалифицированных cv типов с плавающей запятой в качестве типа параметров
x
и
y
.
(since C++23)
std::hypot
для всех cv-неквалифицированных типов с плавающей запятой в качестве типа параметров
x
,
y
и
z
.
(since C++23)
Значение, вычисляемое двухаргументной версией этой функции, представляет собой длину гипотенузы прямоугольного треугольника со сторонами длиной
x
и
y
, или расстояние от точки
(x,y)
до начала координат
(0,0)
, или модуль комплексного числа
x+
i
y
.
Значение, вычисляемое трёхаргументной версией этой функции, представляет собой расстояние точки
(x,y,z)
от начала координат
(0,0,0)
.
Содержание |
Параметры
| x, y, z | - | значения с плавающей точкой или целочисленные значения |
Возвращаемое значение
+y 2
.
+y 2
+z 2
.
Если происходит ошибка диапазона из-за переполнения,
+HUGE_VAL
,
+HUGE_VALF
, или
+HUGE_VALL
возвращается.
Если происходит ошибка диапазона из-за потери значимости, возвращается корректный результат (после округления).
Обработка ошибок
Ошибки сообщаются, как указано в math_errhandling .
Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559),
- std :: hypot ( x, y ) , std :: hypot ( y, x ) и std :: hypot ( x, - y ) эквивалентны.
- если один из аргументов равен ±0, std :: hypot ( x, y ) эквивалентно вызову std::fabs с ненулевым аргументом.
- если один из аргументов равен ±∞, std :: hypot ( x, y ) возвращает +∞ даже если другой аргумент является NaN.
- в остальных случаях, если любой из аргументов является NaN, возвращается NaN.
Примечания
Реализации обычно гарантируют точность менее 1 ulp (Unit in the Last Place — Единица младшего разряда): GNU , BSD .
std :: hypot ( x, y ) эквивалентно std :: abs ( std:: complex < double > ( x, y ) ) .
POSIX определяет что исчерпание порядка (underflow) может происходить только тогда, когда оба аргумента являются субнормальными и правильный результат также субнормален (это запрещает наивные реализации).
|
Расстояние между двумя точками
|
(since C++17) |
Дополнительные перегрузки не обязаны быть предоставлены именно в виде (A,B) . Они должны быть достаточными для обеспечения того, чтобы для их первого аргумента num1 , второго аргумента num2 и опционального третьего аргумента num3 :
|
(до C++23) |
|
Если num1 , num2 и num3 имеют арифметические типы, тогда
где /*common-floating-point-type*/ - это тип с плавающей запятой с наибольшим рангом преобразования с плавающей запятой и наибольшим подрангом преобразования с плавающей запятой среди типов num1 , num2 и num3 , при этом аргументы целочисленного типа считаются имеющими тот же ранг преобразования с плавающей запятой, что и double . Если такого типа с плавающей запятой с наибольшим рангом и подрангом не существует, тогда разрешение перегрузки не приводит к пригодному кандидату из предоставленных перегрузок. |
(начиная с C++23) |
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_hypot
|
201603L
|
(C++17) |
Перегрузка с 3 аргументами для
std::hypot
(4,B)
|
Пример
#include <cerrno> #include <cfenv> #include <cfloat> #include <cmath> #include <cstring> #include <iostream> // #pragma STDC FENV_ACCESS ON struct Point3D { float x, y, z; }; int main() { // типичное использование std::cout << "(1,1) cartesian is (" << std::hypot(1, 1) << ',' << std::atan2(1,1) << ") polar\n"; Point3D a{3.14, 2.71, 9.87}, b{1.14, 5.71, 3.87}; // C++17 имеет перегрузку hypot с тремя аргументами: std::cout << "distance(a,b) = " << std::hypot(a.x - b.x, a.y - b.y, a.z - b.z) << '\n'; // специальные значения std::cout << "hypot(NAN,INFINITY) = " << std::hypot(NAN, INFINITY) << '\n'; // обработка ошибок errno = 0; std::feclearexcept(FE_ALL_EXCEPT); std::cout << "hypot(DBL_MAX,DBL_MAX) = " << std::hypot(DBL_MAX, DBL_MAX) << '\n'; if (errno == ERANGE) std::cout << " errno = ERANGE " << std::strerror(errno) << '\n'; if (std::fetestexcept(FE_OVERFLOW)) std::cout << " FE_OVERFLOW raised\n"; }
Вывод:
(1,1) cartesian is (1.41421,0.785398) polar
distance(a,b) = 7
hypot(NAN,INFINITY) = inf
hypot(DBL_MAX,DBL_MAX) = inf
errno = ERANGE Numerical result out of range
FE_OVERFLOW raised
Смотрите также
|
(C++11)
(C++11)
|
возводит число в заданную степень (
x
y
)
(функция) |
|
(C++11)
(C++11)
|
вычисляет квадратный корень (
√
x
)
(функция) |
|
(C++11)
(C++11)
(C++11)
|
вычисляет кубический корень (
3
√
x
)
(функция) |
|
возвращает модуль комплексного числа
(шаблон функции) |
|
|
C documentation
для
hypot
|
|