Namespaces
Variants

std:: sqrt (std::valarray)

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

Für jedes Element in va wird die Quadratwurzel des Werts des Elements berechnet.

Inhaltsverzeichnis

Parameter

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

Rückgabewert

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

Hinweise

Unqualifizierte Funktion ( sqrt ) wird zur Berechnung verwendet. Falls eine solche Funktion nicht verfügbar ist, std:: sqrt wird aufgrund von argumentabhängiger Namenssuche verwendet.

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

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)