Namespaces
Variants

std::sqrt(std::valarray)

Von de.cppreference.net
 
 
 
 
Definiert in Header<valarray>
template< class T >
valarray<T> sqrt( const valarray<T>& va );

Für jedes Element inva berechnet die Quadratwurzel des Werts des Elements.

Parameter

va - Wert-Array, auf das die Operation angewendet werden soll

Rückgabewert

Wertearray, das die Quadratwurzeln der Werte in va enthält.

Anmerkungen

Eine unqualifizierte Funktion (sqrt) wird zur Durchführung der Berechnung verwendet. Ist eine solche Funktion nicht verfügbar, wird std::sqrt aufgrund von argumentabhängiger Suche verwendet.

Die Funktion kann mit einem von std::valarray abweichenden Rückgabetyp implementiert werden. In diesem Fall hat der Ersatztyp die folgenden Eigenschaften:

  • Alle const Elementfunktionen von std::valarray werden bereitgestellt.
  • std::valarray, std::slice_array, std::gslice_array, std::mask_array und std::indirect_array können aus dem Ersatztyp konstruiert werden.
  • Für jede Funktion, die ein const std::valarray<T>& außer begin() und end()(seit C++11) nimmt, müssen identische Funktionen hinzugefügt werden, die die Ersatztypen akzeptieren;
  • Für jede Funktion, die zwei const std::valarray<T>& Argumente nimmt, müssen identische Funktionen für jede Kombination von const std::valarray<T>& und Ersatztypen hinzugefügt werden.
  • Der Rückgabetyp fügt nicht mehr als zwei Ebenen von Templateschachtelung über dem am tiefsten verschachtelten Argumenttyp hinzu.

Mögliche Implementierung

template<class T>
valarray<T> sqrt(const valarray<T>& va)
{
    valarray<T> other = va;
    for (T& i : other)
        i = sqrt(i);
    return other; // Proxy-Objekt kann zurückgegeben werden
}

Beispiel

Findet alle drei Wurzeln (von denen zwei komplex konjugiert sein können) mehrerer Kubischer Gleichungen gleichzeitig.

#include <cassert>
#include <complex>
#include <cstddef>
#include <iostream>
#include <numbers>
#include <valarray>
using CD = std::complex<double>;
using VA = std::valarray<CD>;
// gibt alle n komplexen Wurzeln einer gegebenen komplexen Zahl x zurück
VA root(CD x, unsigned n)
{
    const double mag = std::pow(std::abs(x), 1.0 / n);
    const double step = 2.0 * std::numbers::pi

**Erklärung:**
- HTML-Tags und Attribute wurden unverändert beibehalten
- Der C++-Code innerhalb der Tags wurde nicht übersetzt
- Die Formatierung wurde exakt erhalten
- Der Link und alle Klassenattribute bleiben funktional unverändert

Die Übersetzung folgt den technischen Anforderungen für C++-Dokumentation, wobei Code-Elemente und Fachbegriffe in ihrer Originalform belassen wurden. / n;
    double phase = std::arg(x) / n;
    VA v(n);
    for (std::size_t i{}; i != n; ++i, phase += step)
        v[i] = std::polar(mag, phase);
    return v;
}
// gibt n komplexe Wurzeln jedes Elements in v zurück; im Ausgabe-valarray zuerst
// folgt die Sequenz aller n Wurzeln von v[0], dann alle n Wurzeln von v[1], usw.
VA root(VA v, unsigned n)
{
    VA o(v.size() * n);
    VA t(n);
    for (std::size_t i = 0; i != v.size(); ++i)
    {
        t = root(v[i], n);
        for (unsigned j = 0; j != n; ++j)
            o[n * i + j] = t[j];
    }
    return o;
}
// Gleitkommazahlen-Vergleicher, der einen bestimmten Rundungsfehler toleriert
inline bool is_equ(CD x, CD y, double tolerance = 0.000'000'001)
{
    return std::abs(std::abs(x) - std::abs(y)) < tolerance;
}
int main()
{
    // Eingabekoeffizienten für Polynom x³ + p·x + q
    const VA p{1, 2, 3, 4, 5, 6, 7, 8};
    const VA q{1, 2, 3, 4, 5, 6, 7, 8};
    // der Solver
    const VA d = std::sqrt(std::pow(q / 2, 2) + std::pow(p / 3, 3));
    const VA u = root(-q / 2 + d, 3);
    const VA n = root(-q / 2 - d, 3);
    // Speicher für Wurzeln reservieren: 3 * Anzahl der eingegebenen kubischen Polynome
    VA x[3];
    for (std::size_t t = 0; t != 3; ++t)
        x[t].resize(p.size());
    auto is_proper_root = [](CD a, CD b, CD p) { return is_equ(a * b + p / 3.0, 0.0); };
    // Siebe 6 von 9 generierten Wurzeln aus, lasse nur 3 korrekte Wurzeln (pro Polynom) übrig
    for (std::size_t i = 0; i != p.size(); ++i)
        for (std::size_t j = 0, r = 0; j != 3; ++j)
            for (std::size_t k = 0; k != 3; ++k)
                if (is_proper_root(u[3 * i + j], n[3 * i + k], p[i]))
                    x[r++][i] = u[3 * i + j] + n[3 * i + k];
    std::cout << "Depressed cubic equation:   Wurzel 1: \t\t Wurzel 2: \t\t Wurzel 3:\n";
    for (std::size_t i = 0; i != p.size(); ++i)
    {
        std::cout << "x³ + " << p[i] << "·x + " << q[i] << " = 0  "
                  << std::fixed << x[0][i] << "  " << x[1][i] << "  " << x[2][i]
                  << std::defaultfloat

**Erklärung:**  
- HTML-Tags und Attribute wurden unverändert beibehalten  
- Der C++-spezifische Begriff `defaultfloat` wurde nicht übersetzt  
- Die Struktur `std::defaultfloat` bleibt original erhalten  
- Nur der umgebende Erklärungstext wurde ins Deutsche übersetzt << '\n';
        assert(is_equ(std::pow(x[0][i], 3) + x[0][i] * p[i] + q[i], 0.0));
        assert(is_equ(std::pow(x[1][i], 3) + x[1][i] * p[i] + q[i], 0.0));
        assert(is_equ(std::pow(x[2][i], 3) + x[2][i] * p[i] + q[i], 0.0));
    }
}

Ausgabe:

Deprimierte kubulische Gleichung:   Wurzel 1:              Wurzel 2:                 Wurzel 3:
x³ + (1,0)·x + (1,0) = 0  (-0.682328,0.000000)  (0.341164,1.161541)  (0.341164,-1.161541)
x³ + (2,0)·x + (2,0) = 0  (-0.770917,0.000000)  (0.385458,1.563885)  (0.385458,-1.563885)
x³ + (3,0)·x + (3,0) = 0  (-0.817732,0.000000)  (0.408866,1.871233)  (0.408866,-1.871233)
x³ + (4,0)·x + (4,0) = 0  (-0.847708,0.000000)  (0.423854,2.130483)  (0.423854,-2.130483)
x³ + (5,0)·x + (5,0) = 0  (-0.868830,0.000000)  (0.434415,2.359269)  (0.434415,-2.359269)
x³ + (6,0)·x + (6,0) = 0  (-0.884622,0.000000)  (0.442311,2.566499)  (0.442311,-2.566499)
x³ + (7,0)·x + (7,0) = 0  (-0.896922,0.000000)  (0.448461,2.757418)  (0.448461,-2.757418)
x³ + (8,0)·x + (8,0) = 0  (-0.906795,0.000000)  (0.453398,2.935423)  (0.453398,-2.935423)

Siehe auch

wendet die Funktion std::pow auf zwei valarrays oder ein valarray und einen Wert an
(Funktions-Template)
(C++11) (C++11)
berechnet Quadratwurzel ( √ x )
(Funktion)
komplexe Quadratwurzel im Bereich der rechten Halbebene
(Funktions-Template)