std::hypot, std::hypotf, std::hypotl
在头文件 <cmath> 中定义 |
||
(1) | ||
float hypot ( float x, float y ); double hypot ( double x, double y ); |
(自 C++11 起) (直到 C++23) |
|
/* 浮点类型 */ hypot ( /* 浮点类型 */ x, |
(自 C++23 起) (自 C++26 起为 constexpr) |
|
float hypotf( float x, float y ); |
(2) | (自 C++11 起) (自 C++26 起为 constexpr) |
long double hypotl( long double x, long double y ); |
(3) | (自 C++11 起) (自 C++26 起为 constexpr) |
(4) | ||
float hypot ( float x, float y, float z ); double hypot ( double x, double y, double z ); |
(自 C++17 起) (直到 C++23) |
|
/* 浮点类型 */ hypot ( /* 浮点类型 */ x, |
(自 C++23 起) (自 C++26 起为 constexpr) |
|
在头文件 <cmath> 中定义 |
||
template< class Arithmetic1, Arithmetic2 > /* 通用浮点类型 */ |
(A) | (自 C++11 起) (自 C++26 起为 constexpr) |
template< class Arithmetic1, Arithmetic2, Arithmetic3 > /* 通用浮点类型 */ |
(B) | (自 C++17 起) (自 C++26 起为 constexpr) |
std::hypot
的重载,作为参数 x 和 y 的类型。(自 C++23 起)std::hypot
的重载,作为参数 x、y 和 z 的类型。(自 C++23 起)此函数的两个参数版本计算的值是具有 x 和 y 长度的边的直角三角形的斜边长度,或点 (x,y)
到原点 (0,0)
的距离,或复数 x+iy
的大小。
此函数的三个参数版本计算的值是点 (x,y,z)
到原点 (0,0,0)
的距离。
内容 |
[编辑] 参数
x, y, z | - | 浮点或整数值 |
[编辑] 返回值
+y2
。
+y2
+z2
。
如果由于溢出导致范围错误,则返回 +HUGE_VAL、+HUGE_VALF
或 +HUGE_VALL
。
如果由于下溢导致范围错误,则返回正确结果(四舍五入后)。
[edit] 错误处理
错误报告方式如 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。
[edit] 注意
实现通常保证精度小于 1 ulp(最后一位的单位——最小精度单位):GNU、BSD。
std::hypot(x, y) 等效于 std::abs(std::complex<double>(x, y))。
POSIX 规范 指出,下溢只能在两个参数均为次正规数且正确结果也为次正规数时发生(这禁止了幼稚的实现)。
三维空间中两个点 |
(自 C++17 起) |
额外的重载不需要以 (A,B) 的形式提供。它们只需要足以确保对于第一个参数 num1、第二个参数 num2 和可选的第三个参数 num3
|
(直到 C++23) |
如果 num1、num2 和 num3 具有算术类型,则
其中 /* common-floating-point-type */ 是在 num1、num2 和 num3 的类型中具有最大 浮点转换等级 和最大 浮点转换次等级 的浮点类型,整数类型参数被认为具有与 double 相同的浮点转换等级。 如果不存在具有最大等级和次等级的浮点类型,则 重载解析 不会从提供的重载中产生可用的候选者。 |
(自 C++23 起) |
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__cpp_lib_hypot |
201603L | (C++17) | std::hypot 的 3 个参数重载 |
[edit] 示例
#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() { // typical usage 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 has 3-argument hypot overload: std::cout << "distance(a,b) = " << std::hypot(a.x - b.x, a.y - b.y, a.z - b.z) << '\n'; // special values std::cout << "hypot(NAN,INFINITY) = " << std::hypot(NAN, INFINITY) << '\n'; // error handling 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
[edit] 另请参阅
(C++11)(C++11) |
将一个数字提高到给定的幂 (xy) (函数) |
(C++11)(C++11) |
计算平方根 (√x) (函数) |
(C++11)(C++11)(C++11) |
计算立方根 (3√x) (函数) |
返回复数的大小 (函数模板) | |
C 文档 for hypot
|