名前空間
変種
操作

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

From cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
ヘッダー <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まで)
/*浮動小数点数型*/

            hypot ( /*浮動小数点型*/ x,

                    /*浮動小数点型*/ y );
(C++23から)
(C++26 以降 constexpr)
float       hypotf( float x, float y );
(2) (C++11以降)
(C++26 以降 constexpr)
long double hypotl( long double x, long double y );
(3) (C++11以降)
(C++26 以降 constexpr)
(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まで)
/*浮動小数点数型*/

            hypot ( /*浮動小数点型*/ x,
                    /*浮動小数点型*/ y,

                    /*浮動小数点型*/ z );
(C++23から)
(C++26 以降 constexpr)
ヘッダー <cmath> で定義
template< class Arithmetic1, Arithmetic2 >

/*共通浮動小数点型*/

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

/*共通浮動小数点型*/

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

この関数の2引数バージョンによって計算される値は、長さ x および y の辺を持つ直角三角形の斜辺の長さ、または原点 (0,0) からの点 (x,y) までの距離、または複素数 x+iy の大きさです。

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

目次

[編集] Parameters

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

[編集] Return value

1-3,A) エラーが発生しない場合、直角三角形の斜辺、x2
+y2
が返されます。
4,B) エラーが発生しない場合、3次元空間での原点からの距離、x2
+y2
+z2
が返されます。

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

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

[編集] Error handling

エラーは 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 が返されます。

[編集] Notes

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

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、2番目の引数 num2、およびオプションの3番目の引数 num3

  • num1num2、または 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))
    と同等の効果を持ちます。
  • それ以外の場合、num1num2、および/または 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))
    と同等の効果を持ちます。
  • それ以外の場合、num1num2、または 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まで)

num1num2、および num3 が算術型の場合、

  • std::hypot(num1, num2)std::hypot(static_cast</*共通浮動小数点型*/>(num1),
               static_cast</*共通浮動小数点型*/>(num2))
    と同等の効果を持ち、
  • std::hypot(num1, num2, num3)std::hypot(static_cast</*共通浮動小数点型*/>(num1),
               static_cast</*共通浮動小数点型*/>(num2),
               static_cast</*共通浮動小数点型*/>(num3))
    と同等の効果を持ちます。

ここで、/*共通浮動小数点型*/ は、num1num2、および num3 の型の中で、最も高い 浮動小数点変換ランク と最も高い 浮動小数点変換サブランク を持つ浮動小数点型です。整数型の引数は、double と同じ浮動小数点変換ランクを持つと見なされます。

そのような最高のランクとサブランクセを持つ浮動小数点型が存在しない場合、オーバーロード解決は提供されたオーバーロードから使用可能な候補を導出しません。

(C++23から)
機能テストマクロ 規格 機能
__cpp_lib_hypot 201603L (C++17) std::hypot の3引数オーバーロード (4,B)

[編集] Example

#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()
{
    // typical usage
    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 has 3-argument hypot overload:
    std::cout << "distance(a,b) = "
              << std::hypot(a.x - b.x, a.y - b.y, a.z - b.z) << '\n';
 
    // special values
    std::cout << "hypot(NAN,INFINITY) = " << std::hypot(NAN, INFINITY) << '\n';
 
    // error handling
    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

[編集] See also

(C++11)(C++11)
数値を指定されたべき乗に累乗する (xy)
(関数) [編集]
(C++11)(C++11)
平方根を計算する (x)
(関数) [編集]
(C++11)(C++11)(C++11)
立方根を計算する (3x)
(関数) [編集]
複素数の大きさを返す
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)