C++ 参考手册

位置:首页 > C++ 参考手册 >数值库 >常用数学函数 > std::hypot, std::hypotf, std::hypotl

定义于头文件 <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) 计算 xy 平方和的平方根,而不会在计算的中间阶段有过度的上溢或下溢。
4) 所有 (1-3) 所不覆盖的算术类型参数组合的重载集或函数模板。若任何参数拥有整数类型,则它被转型为 double 。若任何其他参数为 long double ,则返回类型为 long double ,否则为 double
5-7) 计算 xyz 平方和的平方根,而不会在计算的中间阶段有过度的上溢或下溢。
8) 所有 (5-7) 所不覆盖的算术类型参数组合的重载集或函数模板。若任何参数拥有整数类型,则它被转型为 double 。若任何其他参数为 long double ,则返回类型为 long double ,否则为 double

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

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

参数

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

返回值

1-4) 若不出现错误,则返回直角三角形的斜边, x2
+y2
5-8) 若不出现错误,则返回三维空间中到原点的距离, 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 (最后位置单位)的精度: GNUBSDOpen64

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

参阅

(C++11)(C++11)
求某数的给定次幂( xy
(函数)
(C++11)(C++11)
计算平方根( x
(函数)
(C++11)(C++11)(C++11)
计算立方根( 3x
(函数)
返回复数的模
(函数模板)