命名空间
变体
操作

hypot、hypotf、hypotl

来自 cppreference.com
< c‎ | numeric‎ | math
 
 
 
常见数学函数
类型
(C99)(C99)    

(C99)(C99)    

函数
基本操作
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小操作
(C99)
(C23)    
指数函数
(C23)
(C99)
(C99)
(C23)
(C23)
(C99)
(C99)(C23)
(C23)
(C23)
幂函数
(C99)
(C23)
(C23)
hypot
(C99)
(C23)
(C23)
三角函数和双曲函数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
误差函数和伽马函数
(C99)
(C99)
(C99)
(C99)
最近整数浮点运算
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮点操作函数
(C99)(C99)
(C99)(C23)
(C99)
缩窄操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子和量子指数函数
十进制重新编码函数
全序和有效负载函数
分类
(C99)
(C99)
(C99)
(C23)
宏常量
特殊浮点值
(C99)(C23)
参数和返回值
(C99)(C99)(C99)(C99)(C99)    
错误处理
(C99)    

 
在头文件 <math.h> 中定义
float       hypotf( float x, float y );
(1) (自 C99)
double      hypot( double x, double y );
(2) (自 C99)
long double hypotl( long double x, long double y );
(3) (自 C99)
在头文件 <tgmath.h> 中定义
#define hypot( x, y )
(4) (自 C99)
1-3) 计算 xy 的平方和的平方根,在计算的中间阶段不会出现过度溢出或下溢。
4) 类型泛型宏:如果任何参数具有类型 long double,则调用函数的长双精度版本。否则,如果任何参数具有整型或类型 double,则调用函数的双精度版本。否则,调用函数的 float 版本。

此函数计算的值是直角三角形的斜边长度,其中两条边的长度分别为 xy,或者点 (x, y) 到原点 (0, 0) 的距离,或者复数 x+iy 的模。

内容

[编辑] 参数

x - 浮点值
y - 浮点值

[编辑] 返回值

如果未出现错误,则返回直角三角形的斜边,x2
+y2

如果由于溢出而发生范围错误,则返回 +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 (最后一位单位) 的精度:GNUBSD

hypot(x, y) 等价于 cabs(x + I*y)

POSIX 规定,下溢仅当两个参数均为次正规数且正确结果也为次正规数时才会发生(这禁止了天真的实现)。

hypot(INFINITY, NAN) 返回 +∞,但 sqrt(INFINITY * INFINITY + NAN * NAN) 返回 NaN。

[编辑] 示例

#include <errno.h>
#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON
 
int main(void)
{
    // typical usage
    printf("(1,1) cartesian is (%f,%f) polar\n", hypot(1,1), atan2(1, 1));
 
    // special values
    printf("hypot(NAN,INFINITY) = %f\n", hypot(NAN, INFINITY));
 
    // error handling
    errno = 0;
    feclearexcept(FE_ALL_EXCEPT);
    printf("hypot(DBL_MAX,DBL_MAX) = %f\n", hypot(DBL_MAX, DBL_MAX));
    if (errno == ERANGE)
        perror("    errno == ERANGE");
    if (fetestexcept(FE_OVERFLOW))
        puts("    FE_OVERFLOW raised");
}

可能的输出

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

[编辑] 参考文献

  • C23 标准 (ISO/IEC 9899:2024)
  • 7.12.7.3 hypot 函数 (p: TBD)
  • 7.25 类型泛型数学 <tgmath.h> (p: TBD)
  • F.10.4.3 hypot 函数 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.12.7.3 hypot 函数 (p: 181)
  • 7.25 类型泛型数学 <tgmath.h> (p: 272-273)
  • F.10.4.3 hypot 函数 (p: 382)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.12.7.3 hypot 函数 (p: 248)
  • 7.25 类型泛型数学 <tgmath.h> (p: 373-375)
  • F.10.4.3 hypot 函数 (p: 524)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.12.7.3 hypot 函数 (p: 229)
  • 7.22 类型泛型数学 <tgmath.h> (p: 335-337)
  • F.9.4.3 hypot 函数 (p: 461)

[编辑] 另请参阅

(C99)(C99)
计算一个数的给定次方 (xy)
(函数) [编辑]
(C99)(C99)
计算平方根 (x)
(函数) [编辑]
(C99)(C99)(C99)
计算立方根 (3x)
(函数) [编辑]
(C99)(C99)(C99)
计算复数的大小
(函数) [编辑]
C++ 文档 适用于 hypot