# std::hypot, std::hypotf, std::hypotl

< cpp‎ | numeric‎ | math

定义于头文件 `<cmath>` |  |
float hypot ( float x, float y ); float hypotf( float x, float y ); | (1) | (C++11 起)
double hypot ( double x, double y ); | (2) | (C++11 起)
long double hypot ( long double x, long double y ); long double hypotl( long double x, long double y ); | (3) | (C++11 起)
Promoted hypot ( Arithmetic1 x, Arithmetic2 y ); | (4) | (C++11 起)
float hypot ( float x, float y, float z ); | (5) | (C++17 起)
double hypot ( double x, double y, double z ); | (6) | (C++17 起)
long double hypot ( long double x, long double y, long double z ); | (7) | (C++17 起)
Promoted hypot ( Arithmetic1 x, Arithmetic2 y, Arithmetic3 z ); | (8) | (C++17 起)

1-3) 计算 `x` 与 `y` 平方和的平方根，而不会在计算的中间阶段有过度的上溢或下溢。
4) 所有 (1-3) 所不覆盖的算术类型参数组合的重载集或函数模板。若任何参数拥有整数类型，则它被转型为 double 。若任何其他参数为 long double ，则返回类型为 long double ，否则为 double 。
5-7) 计算 `x` 、 `y` 和 `z` 平方和的平方根，而不会在计算的中间阶段有过度的上溢或下溢。
8) 所有 (5-7) 所不覆盖的算术类型参数组合的重载集或函数模板。若任何参数拥有整数类型，则它被转型为 double 。若任何其他参数为 long double ，则返回类型为 long double ，否则为 double 。

此函数的双参数版本所计算的是直角边长度为 `x` 和 `y` 的直角三角形的斜边长，或点 `(x,y)` 距原点 `(0,0)` 的距离，或复数 `x+iy` 的绝对值。

此函数的三参数版本所计算的值是点 `(x,y,z)` 到原点 `(0,0,0)` 的距离。

### 参数

x, y, z | - | 浮点或整数类型值

### 返回值

1-4) 若不出现错误，则返回直角三角形的斜边， \(\scriptsize{\sqrt{x^2+y^2} }\)√x2
+y2
。
5-8) 若不出现错误，则返回三维空间中到原点的距离， \(\scriptsize{\sqrt{x^2+y^2+z^2} }\)√x2
+y2
+z2
。

若出现上溢所致的值域错误，则返回 `+HUGE_VAL` 、 `+HUGE_VALF` 或 `+HUGE_VALL` 。

若出现下溢所致的值域错误，则返回（舍入后的）正确结果。

### 错误处理

报告 math_errhandling 中指定的错误。

若实现支持 IEEE 浮点算术（ IEC 60559 ），则

- hypot(x, y) 、 hypot(y, x) 及 hypot(x, -y) 等价
- 若参数之一为 ±0 ，则 `hypot` 等价于以非零参数调用 fabs
- 若参数之一为 ±∞ ，则 `hypot` 返回 +∞ ，即使另一参数为 NaN
- 否则，若任何参数为 NaN ，则返回 NaN

### 注意

实现通常保证小于 1 ulp （最后位置单位）的精度： GNU 、 BSD 、 Open64 。

std::hypot(x, y) 等价于 std::abs(std::complex<double>(x,y)) 。

POSIX 指定仅若二个参数均为非正规且正确结果亦为非正规才可以出现下溢（这禁止朴素实现）。

能以 std::hypot(x2-x1, y2-y1, z2-z1) 计算二个点 `(x1,y1,z1)` 和 `(x2,y2,z2)` 在三维空间中的距离。 | (C++17 起)

### 示例

    #include <iostream>
    #include <cmath>
    #include <cerrno>
    #include <cfenv>
    #include <cfloat>
    #include <cstring>

    #pragma STDC FENV_ACCESS ON
    int main()
    {
        // 通常用法
        std::cout << "(1,1) cartesian is (" << std::hypot(1,1)
                  << ',' << std::atan2(1,1) << ") polar\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 (fetestexcept(FE_OVERFLOW))
            std::cout << "    FE_OVERFLOW raised\n";
    }

输出：

    (1,1) cartesian is (1.41421,0.785398) polar
    hypot(NAN,INFINITY) = inf
    hypot(DBL_MAX,DBL_MAX) = inf
        errno = ERANGE Numerical result out of range
        FE_OVERFLOW raised

### 参阅

pow powf powl (C++11)(C++11) | 求某数的给定次幂（ \(\small{x^y}\)xy ） (函数)
sqrt sqrtf sqrtl (C++11)(C++11) | 计算平方根（ \(\small{\sqrt{x} }\)√x ） (函数)
cbrt cbrtf cbrtl (C++11)(C++11)(C++11) | 计算立方根（ \(\small{\sqrt[3]{x} }\)3√x ） (函数)
abs(std::complex) | 返回复数的模 (函数模板)