Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
Definiert in der Header-Datei <cmath>
(1)
float       hypot ( float x, float y );

double      hypot ( double x, double y );

long double hypot ( long double x, long double y );
(seit C++11)
(bis C++23)
/* Gleitkommazahl-Typ */

            hypot ( /* Gleitkommazahl-Typ */ x,

                    /* Gleitkommazahl-Typ */ y );
(seit C++23)
(constexpr seit C++26)
float       hypotf( float x, float y );
(2) (seit C++11)
(constexpr seit C++26)
long double hypotl( long double x, long double y );
(3) (seit C++11)
(constexpr seit 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 );
(seit C++17)
(bis C++23)
/* Gleitkommazahl-Typ */

            hypot ( /* Gleitkommazahl-Typ */ x,
                    /* Gleitkommazahl-Typ */ y,

                    /* Gleitkommazahl-Typ */ z );
(seit C++23)
(constexpr seit C++26)
Definiert in der Header-Datei <cmath>
template< class Arithmetic1, Arithmetic2 >

/*gemeinsamer Gleitkommazahl-Typ*/

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

/*gemeinsamer Gleitkommazahl-Typ*/

            hypot ( Arithmetic1 x, Arithmetic2 y, Arithmetic3 z );
(B) (seit C++17)
1-3) Berechnet die Quadratwurzel der Summe der Quadrate von x und y, ohne übermäßigen Überlauf oder Unterlauf bei Zwischenschritten der Berechnung.Die Bibliothek stellt Überladungen von std::hypot für alle cv-unqualifizierten Gleitkommazahl-Typen als Typ der Parameter x und y bereit.(seit C++23)
4) Berechnet die Quadratwurzel der Summe der Quadrate von x, y und z, ohne übermäßigen Überlauf oder Unterlauf bei Zwischenschritten der Berechnung.Die Bibliothek stellt Überladungen von std::hypot für alle cv-unqualifizierten Gleitkommazahl-Typen als Typ der Parameter x, y und z bereit.(seit C++23)
A,B) Zusätzliche Überladungen werden für alle anderen Kombinationen von arithmetischen Typen bereitgestellt.

Der von der zweistelligen Version dieser Funktion berechnete Wert ist die Länge der Hypotenuse eines rechtwinkligen Dreiecks mit den Seitenlängen x und y, oder der Abstand des Punktes (x,y) vom Ursprung (0,0), oder die Magnitude einer komplexen Zahl x+iy.

Der von der dreistelligen Version dieser Funktion berechnete Wert ist der Abstand des Punktes (x,y,z) vom Ursprung (0,0,0).

Inhalt

[edit] Parameter

x, y, z - Gleitkomma- oder Ganzzahlwerte

[edit] Rückgabewert

1-3,A) Wenn keine Fehler auftreten, wird die Hypotenuse eines rechtwinkligen Dreiecks zurückgegeben: x2
+y2
.
4,B) Wenn keine Fehler auftreten, wird der Abstand vom Ursprung im 3D-Raum zurückgegeben: x2
+y2
+z2
.

Wenn ein Bereichsfehler aufgrund von Überlauf auftritt, wird +HUGE_VAL, +HUGE_VALF oder +HUGE_VALL zurückgegeben.

Wenn ein Bereichsfehler aufgrund von Unterlauf auftritt, wird das korrekte Ergebnis (nach Rundung) zurückgegeben.

[edit] Fehlerbehandlung

Fehler werden wie in math_errhandling beschrieben gemeldet.

Wenn die Implementierung IEEE-Gleitkomma-Arithmetik (IEC 60559) unterstützt,

  • std::hypot(x, y), std::hypot(y, x) und std::hypot(x, -y) sind äquivalent.
  • Wenn einer der Argumente ±0 ist, ist std::hypot(x, y) äquivalent zu std::fabs, aufgerufen mit dem Nicht-Null-Argument.
  • Wenn einer der Argumente ±∞ ist, gibt std::hypot(x, y) +∞ zurück, auch wenn das andere Argument NaN ist.
  • Andernfalls, wenn eines der Argumente NaN ist, wird NaN zurückgegeben.

[edit] Hinweise

Implementierungen garantieren normalerweise eine Präzision von weniger als 1 ulp (Unit in the Last Place — Einheit der letzten Stelle): GNU, BSD.

std::hypot(x, y) ist äquivalent zu std::abs(std::complex<double>(x, y)).

POSIX schreibt vor, dass ein Unterlauf nur auftreten darf, wenn beide Argumente subnormal sind und das korrekte Ergebnis ebenfalls subnormal ist (dies verbietet naive Implementierungen).

Der Abstand zwischen zwei Punkten (x1, y1, z1) und (x2, y2, z2) im 3D-Raum kann mit der dreistelligen Überladung von std::hypot als std::hypot(x2 - x1, y2 - y1, z2 - z1) berechnet werden.

(seit C++17)

Die zusätzlichen Überladungen müssen nicht exakt wie in (A,B) bereitgestellt werden. Sie müssen nur ausreichen, um sicherzustellen, dass für ihr erstes Argument num1, zweites Argument num2 und optional drittes Argument num3

  • Wenn num1, num2 oder num3 den Typ long double hat, dann
  • std::hypot(num1, num2) hat die gleiche Wirkung wie std::hypot(static_cast<long double>(num1),
               static_cast<long double>(num2))
    und
  • std::hypot(num1, num2, num3) hat die gleiche Wirkung wie std::hypot(static_cast<long double>(num1),
               static_cast<long double>(num2),
               static_cast<long double>(num3))
    .
  • Andernfalls, wenn num1, num2 und/oder num3 den Typ double oder einen Ganzzahltyp hat, dann
  • std::hypot(num1, num2) hat die gleiche Wirkung wie std::hypot(static_cast<double>(num1),
               static_cast<double>(num2))
    und
  • std::hypot(num1, num2, num3) hat die gleiche Wirkung wie std::hypot(static_cast<double>(num1),
               static_cast<double>(num2),
               static_cast<double>(num3))
    .
  • Andernfalls, wenn num1, num2 oder num3 den Typ float hat, dann
  • std::hypot(num1, num2) hat die gleiche Wirkung wie std::hypot(static_cast<float>(num1),
               static_cast<float>(num2))
    und
  • std::hypot(num1, num2, num3) hat die gleiche Wirkung wie std::hypot(static_cast<float>(num1),
               static_cast<float>(num2),
               static_cast<float>(num3))
    .
(bis C++23)

Wenn num1, num2 und num3 arithmetische Typen haben, dann

  • std::hypot(num1, num2) hat die gleiche Wirkung wie std::hypot(static_cast</*gemeinsamer Gleitkommazahl-Typ*/>(num1),
               static_cast</*gemeinsamer Gleitkommazahl-Typ*/>(num2))
    und
  • std::hypot(num1, num2, num3) hat die gleiche Wirkung wie std::hypot(static_cast</*gemeinsamer Gleitkommazahl-Typ*/>(num1),
               static_cast</*gemeinsamer Gleitkommazahl-Typ*/>(num2),
               static_cast</*gemeinsamer Gleitkommazahl-Typ*/>(num3))
    ,

wobei /*gemeinsamer Gleitkommazahl-Typ*/ der Gleitkommazahltyp mit dem höchsten Gleitkomma-Umwandlungsrang und dem höchsten Gleitkomma-Umwandlungs-Subrang unter den Typen von num1, num2 und num3 ist. Argumente vom Ganzzahltyp werden so betrachtet, als hätten sie den gleichen Gleitkomma-Umwandlungsrang wie double.

Wenn kein solcher Gleitkommazahltyp mit dem höchsten Rang und Subrang existiert, dann führt die Überladungsauflösung nicht zu einem nutzbaren Kandidaten aus den bereitgestellten Überladungen.

(seit C++23)
Feature-Test-Makro Wert Std Feature
__cpp_lib_hypot 201603L (C++17) 3-Argument-Überladung von std::hypot (4,B)

[edit] Beispiel

#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";
}

Ausgabe

(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

[edit] Siehe auch

(C++11)(C++11)
erhöht eine Zahl zur gegebenen Potenz (xy)
(Funktion) [bearbeiten]
(C++11)(C++11)
berechnet die Quadratwurzel (x)
(Funktion) [bearbeiten]
(C++11)(C++11)(C++11)
berechnet die Kubikwurzel (3x)
(Funktion) [bearbeiten]
gibt den Betrag einer komplexen Zahl zurück
(function template) [edit]
C-Dokumentation für hypot