名前空間
変種
操作

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> で定義
float       hypot ( float x, float y );
float       hypotf( float x, float y );
(1) (C++11以上)
double      hypot ( double x, double y );
(2) (C++11以上)
long double hypot ( long double x, long double y );
long double hypotl( long double x, long double y );
(3) (C++11以上)
昇格後の型    hypot ( 算術型1 x, 算術型2 y );
(4) (C++11以上)
float       hypot ( float x, float y, float z );
(5) (C++17以上)
double      hypot ( double x, double y, double z );
(6) (C++17以上)
long double hypot ( long double x, long double y, long double z );
(7) (C++17以上)
昇格後の型    hypot ( 算術型1 x, 算術型2 y, 算術型3 z );
(8) (C++17以上)
1-3) 計算の中間ステージで不適切なオーバーフローやアンダーフローを起こさずに、 xy の平方の和の平方根を計算します。
4) (1-3) でカバーされない算術型の引数のすべての組み合わせに対するオーバーロード集合または関数テンプレート。 いずれかの引数が整数型の場合、それは double にキャストされます。 他のいずれかの引数が long double の場合、戻り値型は long double になり、そうでなければ double になります。
5-7) 計算の中間ステージで不適切なオーバーフローやアンダーフローを起こさずに、 xy および z の平方の和の平方根を計算します。
8) (5-7) でカバーされない算術型の引数のすべての組み合わせに対するオーバーロード集合または関数テンプレート。 いずれかの引数が整数型の場合、それは double にキャストされます。 他のいずれかの引数が long double の場合、戻り値型は long double になり、そうでなければ double になります。

この関数の2引数版によって計算される値は、2辺の長さが x および y の直角三角形の斜辺の長さ、または原点 (0,0) から点 (x,y) までの距離、または複素数 x+iy の絶対値です。

この関数の3引数版によって計算される値は、原点 (0,0,0) から点 (x,y,z) までの距離です。

目次

[編集] 引数

x, y, z - 浮動小数点または整数型の値

[編集] 戻り値

1-4) エラーが発生しなければ、直角三角形の斜辺 x2
+y2
が返されます。
5-8) エラーが発生しなければ、3D空間の原点からの距離 x2
+y2
+z2
が返されます。

オーバーフローによる値域エラーが発生した場合、 +HUGE_VAL+HUGE_VALF または +HUGE_VALL が返されます。

アンダーフローによる値域エラーが発生した場合、 (丸めの後の) 正しい結果が返されます。

[編集] エラー処理

math_errhandling で規定されている通りにエラーが報告されます。

処理系が IEEE 浮動小数点算術 (IEC 60559) をサポートしている場合、

  • hypot(x, y)hypot(y, x)hypot(x, -y) は同等です。
  • 引数のひとつが ±0 であれば、 hypot(x,y) は他方の引数で fabs を呼ぶのと同等です。
  • 引数のひとつが ±∞ であれば、他方の引数が NaN であっても、 hypot(x,y) は +∞ を返します。
  • そうでなく、いずれかの引数が NaN であれば、 NaN が返されます。

[編集] ノート

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

std::hypot(x, y)std::abs(std::complex<double>(x,y)) と同等です。

POSIX は、引数がどちらも非正規化数で、正しい結果も非正規化数である場合にのみ、アンダーフローが発生する可能性があると規定しています (これはナイーブな実装を禁止します)。

3D空間上の2点 (x1,y1,z1) および (x2,y2,z2) の間の距離は std::hypot(x2-x1, y2-y1, z2-z1) として計算することができます。

[編集]

#include <iostream>
#include <cmath>
#include <cerrno>
#include <cfenv>
#include <cfloat>
#include <cstring>
 
#pragma STDC FENV_ACCESS ON
int main()
{
    // 一般的な使用方法
    std::cout << "(1,1) cartesian is (" << std::hypot(1,1)
              << ',' << std::atan2(1,1) << ") polar\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 raised\n";
}

出力:

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

[編集] 関連項目

(C++11)(C++11)
xy 乗 (xy) を計算します
(関数) [edit]
(C++11)(C++11)
平方根 (x) を計算します
(関数) [edit]
(C++11)(C++11)(C++11)
立方根 (3x) を計算します
(関数) [edit]
複素数の絶対値を返します
(関数テンプレート) [edit]