命名空间
变体
操作

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

来自 cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本操作
(C++11)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
指数函数
(C++11)
(C++11)

(C++11)
(C++11)
幂函数
(C++11)
hypot
(C++11)
三角函数
双曲函数
(C++11)
(C++11)
(C++11)

误差函数和伽马函数
(C++11)
(C++11)
(C++11)
(C++11)
最接近整数浮点运算
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
浮点操作函数
(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)
(C++11)
分类和比较
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
类型
(C++11)
(C++11)
(C++11)
宏常量
分类
(C++11)(C++11)(C++11)(C++11)(C++11)


 
在头文件 <cmath> 中定义
(1)
float       hypot ( float x, float y );

double      hypot ( double x, double y );

long double hypot ( long double x, long double y );
(自 C++11 起)
(直到 C++23)
/* 浮点类型 */

            hypot ( /* 浮点类型 */ x,

                    /* 浮点类型 */ y );
(自 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 );

long double hypot ( long double x, long double y, long double z );
(自 C++17 起)
(直到 C++23)
/* 浮点类型 */

            hypot ( /* 浮点类型 */ x,
                    /* 浮点类型 */ y,

                    /* 浮点类型 */ z );
(自 C++23 起)
(自 C++26 起为 constexpr)
在头文件 <cmath> 中定义
template< class Arithmetic1, Arithmetic2 >

/* 通用浮点类型 */

            hypot ( Arithmetic1 x, Arithmetic2 y );
(A) (自 C++11 起)
(自 C++26 起为 constexpr)
template< class Arithmetic1, Arithmetic2, Arithmetic3 >

/* 通用浮点类型 */

            hypot ( Arithmetic1 x, Arithmetic2 y, Arithmetic3 z );
(B) (自 C++17 起)
(自 C++26 起为 constexpr)
1-3) 计算 xy 平方和的平方根,在计算过程的中间阶段不会发生过大或过小的溢出。库为所有 cv 无限定浮点类型提供 std::hypot 的重载,作为参数 xy 的类型。(自 C++23 起)
4) 计算 xyz 平方和的平方根,在计算过程的中间阶段不会发生过大或过小的溢出。库为所有 cv 无限定浮点类型提供 std::hypot 的重载,作为参数 xyz 的类型。(自 C++23 起)
A,B) 为所有其他算术类型的组合提供额外的重载。

此函数的两个参数版本计算的值是具有 xy 长度的边的直角三角形的斜边长度,或点 (x,y) 到原点 (0,0) 的距离,或复数 x+iy 的大小。

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

内容

[编辑] 参数

x, y, z - 浮点或整数值

[编辑] 返回值

1-3,A) 如果没有错误发生,则返回直角三角形的斜边,x2
+y2
4,B) 如果没有错误发生,则返回 3D 空间中到原点的距离,x2
+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(最后一位的单位——最小精度单位):GNUBSD

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

POSIX 规范 指出,下溢只能在两个参数均为次正规数且正确结果也为次正规数时发生(这禁止了幼稚的实现)。

三维空间中两个点 (x1,y1,z1)(x2,y2,z2) 之间的距离可以使用 std::hypot 的 3 个参数重载计算,如下:std::hypot(x2 - x1, y2 - y1, z2 - z1)

(自 C++17 起)

额外的重载不需要以 (A,B) 的形式提供。它们只需要足以确保对于第一个参数 num1、第二个参数 num2 和可选的第三个参数 num3

  • 如果 num1num2num3 的类型为 long double,则
  • std::hypot(num1, num2)std::hypot(static_cast<long double>(num1),
               static_cast<long double>(num2))
    效果相同,以及
  • std::hypot(num1, num2, num3)std::hypot(static_cast<long double>(num1),
               static_cast<long double>(num2),
               static_cast<long double>(num3))
    效果相同。
  • 否则,如果 num1num2 和/或 num3 的类型为 double 或整数类型,则
  • std::hypot(num1, num2)std::hypot(static_cast<double>(num1),
               static_cast<double>(num2))
    效果相同,以及
  • std::hypot(num1, num2, num3)std::hypot(static_cast<double>(num1),
               static_cast<double>(num2),
               static_cast<double>(num3))
    效果相同。
  • 否则,如果 num1num2num3 的类型为 float,则
  • std::hypot(num1, num2)std::hypot(static_cast<float>(num1),
               static_cast<float>(num2))
    效果相同,以及
  • std::hypot(num1, num2, num3)std::hypot(static_cast<float>(num1),
               static_cast<float>(num2),
               static_cast<float>(num3))
    效果相同。
(直到 C++23)

如果 num1num2num3 具有算术类型,则

  • std::hypot(num1, num2)std::hypot(static_cast</* common-floating-point-type */>(num1),
               static_cast</* common-floating-point-type */>(num2))
    效果相同,以及
  • std::hypot(num1, num2, num3)std::hypot(static_cast</* common-floating-point-type */>(num1),
               static_cast</* common-floating-point-type */>(num2),
               static_cast</* common-floating-point-type */>(num3))
    ,

其中 /* common-floating-point-type */ 是在 num1num2num3 的类型中具有最大 浮点转换等级 和最大 浮点转换次等级 的浮点类型,整数类型参数被认为具有与 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)
(函数) [edit]
(C++11)(C++11)
计算平方根 (x)
(函数) [编辑]
(C++11)(C++11)(C++11)
计算立方根 (3x)
(函数) [编辑]
返回复数的大小
(函数模板) [编辑]
C 文档 for hypot