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)
 
在标头 <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 起)
float       hypotf( float x, float y );
(2) (C++11 起)
long double hypotl( long double x, long double y );
(3) (C++11 起)
(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 起)
在标头 <cmath> 定义
template< class Arithmetic1, Arithmetic2 >
/* 公共浮点类型 */ hypot( Arithmetic1 x, Arithmetic2 y );
(A) (C++11 起)
template< class Arithmetic1, Arithmetic2, Arithmetic3 >
/* 公共浮点类型 */ hypot( Arithmetic1 x, Arithmetic2 y, Arithmetic3 z );
(B) (C++17 起)
1-3) 计算 xy 的平方和的平方根,而不会在计算的中间阶段有过度的上溢或下溢。标准库提供所有以无 cv 限定的浮点类型作为参数 xy 的类型的 std::hypot 重载。 (C++23 起)
4) 计算 xyz 的平方和的平方根,而不会在计算的中间阶段有过度的上溢或下溢。标准库提供所有以无 cv 限定的浮点类型作为参数 xyz 的类型的 std::hypot 重载。 (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) 如果不出现错误,那么返回三维空间中到原点的距离,x2
+y2
+z2

如果出现上溢所致的值域错误,那么返回 +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 等价于以非零参数调用 std::fabs
  • 如果参数之一是 ±∞,那么 std::hypot 返回 +∞ ,即使另一参数是 NaN
  • 否则,如果任何参数是 NaN,那么返回 NaN

注解

实现通常保证小于 1 ulp(最后位置单位—最低精度单位)的精度: GNUBSD

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 起)

额外重载不需要以 (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</* 公共浮点类型 */>(num1),
               static_cast</* 公共浮点类型 */>(num2))
    的效果相同,并且
  • std::hypot(num1, num2, num3)std::hypot(static_cast</* 公共浮点类型 */>(num1),
               static_cast</* 公共浮点类型 */>(num2),
               static_cast</* 公共浮点类型 */>(num3))
    的效果相同,

其中 /* 公共浮点类型 */num1num2num3 的类型中浮点转换等级浮点转换子等级最高的浮点类型,整数类型的实参被视为具有与 double 相等的浮点转换等级。

如果不存在等级和子等级最高的浮点类型,那么在重载决议时不会从提供的重载中产生可用的候选。

(C++23 起)

示例

#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) 对应极坐标 (" << std::hypot(1,1)
              << ',' << std::atan2(1,1) << ")\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 (fetestexcept(FE_OVERFLOW))
        std::cout << "    发生 FE_OVERFLOW\n";
}

输出:

笛卡尔坐标 (1,1) 对应极坐标 (1.41421,0.785398)
distance(a,b) = 7
hypot(NAN,INFINITY) = inf
hypot(DBL_MAX,DBL_MAX) = inf
    errno = ERANGE Numerical result out of range
    发生 FE_OVERFLOW

参阅

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