名前空間
変種
操作

hypot, hypotf, hypotl

提供: cppreference.com
< c‎ | numeric‎ | math
 
 
 
一般的な数学関数
関数
基本操作
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)
指数関数
(C99)
(C99)
(C99)
(C99)
冪関数
(C99)
hypot
(C99)
三角関数と双曲線関数
(C99)
(C99)
(C99)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
最も近い整数
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
浮動小数点操作関数
(C99)(C99)
(C99)
(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 型の場合は関数の long double 版が呼ばれます。 そうでなく、いずれかの引数が整数型または double 型の場合は関数の double 版が呼ばれます。 そうでなければ関数の float 版が呼ばれます。

この関数によって計算される値は、2辺の長さが x および y の直角三角形の斜辺の長さ、または原点 (0,0) から点 (x,y) までの距離、または複素数 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 を呼ぶのと同等です。
  • 引数のひとつが ±∞ であれば、他方の引数が NaN であっても、 hypot は +∞ を返します。
  • そうでなく、いずれかの引数が NaN であれば、 NaN が返されます。

[編集] ノート

処理系は通常、 1 ulp (units in the last place) 未満の精度を保証します (GNU, BSD, Open64)。

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 standard (ISO/IEC 9899:2011):
  • 7.12.7.3 The hypot functions (p: 248)
  • 7.25 Type-generic math <tgmath.h> (p: 373-375)
  • F.10.4.3 The hypot functions (p: 524)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.12.7.3 The hypot functions (p: 229)
  • 7.22 Type-generic math <tgmath.h> (p: 335-337)
  • F.9.4.3 The hypot functions (p: 461)

[編集] 関連項目

(C99)(C99)
xy 乗 (xy) を計算します
(関数) [edit]
(C99)(C99)
平方根 (x) を計算します
(関数) [edit]
(C99)(C99)(C99)
立方根 (3x) を計算します
(関数) [edit]
(C99)(C99)(C99)
複素数の絶対値を計算します
(関数) [edit]