C
数值 | Numerics

hypot

hypot, hypotf, hypotl

在头文件中定义
float hypotf(float x,float y);(1)(自C99以来)
double hypot(double x,double y);(2)(自C99以来)
long double hypot(long double x,long double y);(3)(自C99以来)
在头文件<tgmath.h>中定义
#define hypot(x,y)(4)(自C99以来)

1-3)计算x和y平方和的平方根,而不会在计算的中间阶段发生不适当的上溢或下溢。

4)类型 - 通用宏:如果任何参数的类型为long double,则调用函数的长双重版本。 否则,如果任何参数具有整数类型或具有double类型,则调用该函数的双重版本。 否则,函数的float版本被调用。

由这个函数计算出的值是直角三角形的斜边长度,边长x和y,或点(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)是等价的

注意

实现通常保证精度小于1 ulp(最后一个单位):GNUBSDOpen64

hypot(x, y)相当于cabs(x + I*y)

POSIX指定只有当两个参数都是低于正常值且正确的结果也是低于正常值时才会发生下溢(这禁止了较为简单的实现)。

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

#include <stdio.h> #include <math.h> #include <errno.h> #include <fenv.h> #include <float.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

参考

  • C11标准(ISO / IEC 9899:2011):

扩展内容

powpowfpowl(C99)(C99)计算一个给定的功率(xy)(函数)
sqrtsqrtfsqrtl(C99)(C99)计算平方根(√x)(函数)
cbrtcbrtfcbrtl(C99)(C99)(C99)计算立方根(3√x)(函数)
cabscabsfcabsl(C99)(C99)(C99)计算复数(函数)的大小

| 关于hypot的C ++文档 |