hypot, hypotf, hypotl
From cppreference.com
| ヘッダー <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) x および y の二乗和の平方根を、計算の中間段階での過度のオーバーフローやアンダーフローなしに計算します。
4) 型汎用マクロ: いずれかの引数が long double 型の場合、関数の long double バージョンが呼び出されます。それ以外の場合、いずれかの引数が整数型または double 型の場合、関数の double バージョンが呼び出されます。それ以外の場合、float バージョンが呼び出されます。
この関数によって計算される値は、長さ x および y の辺を持つ直角三角形の斜辺の長さ、または点 (x, y) から原点 (0, 0) までの距離、または複素数 x+iy の大きさです。
目次 |
[編集] パラメータ
| x | - | floating-point value |
| y | - | floating-point value |
[編集] 戻り値
エラーが発生しなかった場合、直角三角形の斜辺、すなわち √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(最下位桁における単位)未満の精度が保証されます(GNU、 BSD)。
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 The hypot functions (p: TBD)
- 7.25 Type-generic math <tgmath.h> (p: TBD)
- F.10.4.3 The hypot functions (p: TBD)
- C17標準 (ISO/IEC 9899:2018)
- 7.12.7.3 The hypot functions (p: 181)
- 7.25 型総称数学関数 <tgmath.h> (p: 272-273)
- F.10.4.3 The hypot functions (p: 382)
- C11標準 (ISO/IEC 9899:2011)
- 7.12.7.3 The hypot functions (p: 248)
- 7.25 型総称数学関数 <tgmath.h> (p: 373-375)
- F.10.4.3 The hypot functions (p: 524)
- C99標準 (ISO/IEC 9899:1999)
- 7.12.7.3 The hypot functions (p: 229)
- 7.22 型総称数学関数 <tgmath.h> (p: 335-337)
- F.9.4.3 The hypot functions (p: 461)
[編集] 関連項目
| (C99)(C99) |
指定されたべき乗の数を計算する (xy) (関数) |
| (C99)(C99) |
平方根を計算する (√x) (関数) |
| (C99)(C99)(C99) |
立方根を計算する (3√x) (関数) |
| (C99)(C99)(C99) |
複素数の絶対値を計算する (関数) |
| C++ ドキュメント for hypot
| |