Namespaces
Variants

std:: hypot, std:: hypotf, std:: hypotl

From ja.cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
ヘッダー <cmath> で定義
(1)
float hypot ( float x, float y ) ;

double hypot ( double x, double y ) ;

long double hypot ( long double x, long double y ) ;
(C++11以降)
(C++23以前)
/*floating-point-type*/

hypot ( /*floating-point-type*/ x,

/*floating-point-type*/ y ) ;
(C++23以降)
(constexpr C++26以降)
float hypotf ( float x, float y ) ;
(2) (C++11以降)
(constexpr C++26以降)
long double hypotl ( long double x, long double y ) ;
(3) (C++11以降)
(constexpr C++26以降)
(4)
float hypot ( float x, float y, float z ) ;

double hypot ( double x, double y, double z ) ;

long double hypot ( long double x, long double y, long double z ) ;
(C++17以降)
(C++23以前)
/*floating-point-type*/

hypot ( /*floating-point-type*/ x,
/*floating-point-type*/ y,

/*floating-point-type*/ z ) ;
(C++23以降)
(constexpr C++26以降)
ヘッダー <cmath> で定義
template < class Arithmetic1, Arithmetic2 >

/*common-floating-point-type*/

hypot ( Arithmetic1 x, Arithmetic2 y ) ;
(A) (C++11以降)
(constexpr C++26以降)
template < class Arithmetic1, Arithmetic2, Arithmetic3 >

/*common-floating-point-type*/

hypot ( Arithmetic1 x, Arithmetic2 y, Arithmetic3 z ) ;
(B) (C++17以降)
1-3) x と y の二乗和の平方根を計算する。計算の中間段階において過度のオーバーフローやアンダーフローが発生しないように処理される。 ライブラリは、 std::hypot のオーバーロードを、パラメータ x と y の型としてすべてのcv修飾されない浮動小数点型に対して提供する。 (C++23以降)
4) x、y、zの二乗和の平方根を計算する。計算の中間段階において過度のオーバーフローやアンダーフローが発生しない。 ライブラリは、パラメータ x 、 y 、 z の型として、すべてのcv修飾されない浮動小数点型に対する std::hypot のオーバーロードを提供する。 (C++23以降)
A,B) その他の算術型の全ての組み合わせに対して追加のオーバーロードが提供されます。

この関数の2引数バージョンで計算される値は、長さ x と y の辺を持つ直角三角形の斜辺の長さ、あるいは点 (x,y) から原点 (0,0) までの距離、または複素数 x+ i y の絶対値である。

この関数の3引数バージョンで計算される値は、点 (x,y,z) から原点 (0,0,0) までの距離です。

目次

パラメータ

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

戻り値

1-3,A) エラーが発生しない場合、直角三角形の斜辺 √ x 2
+y 2
が返されます。
4,B) エラーが発生しない場合、3D空間における原点からの距離、 √ x 2
+y 2
+z 2
が返されます。

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

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

エラーハンドリング

エラーは math_errhandling で指定された通りに報告されます。

IEEE浮動小数点演算(IEC 60559)を実装がサポートしている場合、

  • std :: hypot ( x, y ) 、 std :: hypot ( y, x ) および std :: hypot ( x, - y ) は等価です。
  • 引数のいずれかが ±0 の場合、 std :: hypot ( x, y ) は非ゼロ引数で呼び出された std::fabs と等価です。
  • 引数のいずれかが ±∞ の場合、 std :: hypot ( x, y ) は他方の引数が NaN であっても +∞ を返します。
  • それ以外の場合、いずれかの引数が NaN であれば NaN が返されます。

注記

実装は通常、1 ulp (Unit in the Last Place — 最小精度単位) 未満の精度を保証します: GNU , BSD .

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

POSIXは アンダーフローが発生するのは、両方の引数が非正規化数であり、かつ正しい結果も非正規化数である場合のみであると規定しています(これは単純な実装を禁止するものです)。

3次元空間における2点 (x1, y1, z1) と (x2, y2, z2) 間の距離は、 std::hypot の3引数オーバーロードを使用して std :: hypot ( x2 - x1, y2 - y1, z2 - z1 ) として計算できます。

(C++17以降)

追加のオーバーロードは必ずしも (A,B) の形式で提供される必要はありません。それらは、第一引数 num1 、第二引数 num2 、およびオプションの第三引数 num3 に対して以下を保証するのに十分であればよいのです:

  • num1 、 num2 または num3 が long double 型を持つ場合、
  • std :: hypot ( num1, num2 ) は std :: hypot ( static_cast < long double > ( num1 ) ,
    static_cast < long double > ( num2 ) )
    と同じ効果を持ち、
  • std :: hypot ( num1, num2, num3 ) は std :: hypot ( static_cast < long double > ( num1 ) ,
    static_cast < long double > ( num2 ) ,
    static_cast < long double > ( num3 ) )
    と同じ効果を持ちます。
  • それ以外の場合、 num1 、 num2 および/または num3 が double 型または整数型を持つ場合、
  • std :: hypot ( num1, num2 ) は std :: hypot ( static_cast < double > ( num1 ) ,
    static_cast < double > ( num2 ) )
    と同じ効果を持ち、
  • std :: hypot ( num1, num2, num3 ) は std :: hypot ( static_cast < double > ( num1 ) ,
    static_cast < double > ( num2 ) ,
    static_cast < double > ( num3 ) )
    と同じ効果を持ちます。
  • そうでなければ、 num1 、 num2 または num3 が float 型を持つ場合、
  • std :: hypot ( num1, num2 ) は std :: hypot ( static_cast < float > ( num1 ) ,
    static_cast < float > ( num2 ) )
    と同じ効果を持ち、
  • std :: hypot ( num1, num2, num3 ) は std :: hypot ( static_cast < float > ( num1 ) ,
    static_cast < float > ( num2 ) ,
    static_cast < float > ( num3 ) )
    と同じ効果を持ちます。
(C++23まで)

num1 、 num2 および num3 が算術型を持つ場合、

  • std :: hypot ( num1, num2 ) は std :: hypot ( static_cast < /*common-floating-point-type*/ > ( num1 ) ,
    static_cast < /*common-floating-point-type*/ > ( num2 ) )
    と同じ効果を持ち、
  • std :: hypot ( num1, num2, num3 ) は std :: hypot ( static_cast < /*common-floating-point-type*/ > ( num1 ) ,
    static_cast < /*common-floating-point-type*/ > ( num2 ) ,
    static_cast < /*common-floating-point-type*/ > ( num3 ) )
    と同じ効果を持つ。

ここで /*common-floating-point-type*/ は、 num1 、 num2 および num3 の型の中で最も高い 浮動小数点変換ランク と最も高い 浮動小数点変換サブランク を持つ浮動小数点型であり、整数型の引数は double と同じ浮動小数点変換ランクを持つものと見なされる。

最も高いランクとサブランクを持つ浮動小数点型が存在しない場合、 オーバーロード解決 は提供されたオーバーロードから使用可能な候補を結果として得ない。

(C++23以降)
機能テスト マクロ 値 標準 機能
__cpp_lib_hypot 201603L (C++17) std::hypotの 3引数オーバーロード (4,B)

例

#include <cerrno>
#include <cfenv>
#include <cfloat>
#include <cmath>
#include <cstring>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
struct Point3D { float x, y, z; };
int main()
{
    // 典型的な使用例
    std::cout << "(1,1) cartesian is (" << std::hypot(1, 1)
              << ',' << std::atan2(1,1) << ") polar\n";
    Point3D a{3.14, 2.71, 9.87}, b{1.14, 5.71, 3.87};
    // C++17 には3引数の hypot オーバーロードがあります:
    std::cout << "distance(a,b) = "
              << std::hypot(a.x - b.x, a.y - b.y, a.z - b.z) << '\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 (std::fetestexcept(FE_OVERFLOW))
        std::cout << "    FE_OVERFLOW raised\n";
}

出力:

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

関連項目

(C++11) (C++11)
数値を指定された累乗に引き上げる ( x y )
(関数)
(C++11) (C++11)
平方根を計算する ( √ x )
(関数)
(C++11) (C++11) (C++11)
立方根を計算する ( 3 √ x )
(関数)
複素数の絶対値を返す
(関数テンプレート)