Namespaces
Variants

std::saturating_mul

Von de.cppreference.net
 
 
 
 
Definiert in Header <numeric>
template< class T >
constexpr T saturating_mul( T x, T y ) noexcept;
(seit C++26)

Berechnet die sättigende Multiplikation x × y. Diese Operation verhält sich (im Gegensatz zu eingebauten arithmetischen Operationen auf Ganzzahlen) so, als ob sie eine mathematische Operation mit einem unendlichen Bereich wäre. Sei q das Ergebnis einer solchen Operation. Gibt zurück:

  • q, wenn q als Wert des Typs T darstellbar ist. Andernfalls
  • den größten oder kleinsten Wert des Typs T, je nachdem, welcher dem q näher ist.

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn T ein Ganzzahltyp ist, d. h.: signed char, short, int, long, long long, ein erweiterter vorzeichenbehafteter Ganzzahltyp oder eine vorzeichenlose Version solcher Typen. Insbesondere darf T nicht (möglicherweise cv-qualifiziert) bool, char, wchar_t, char8_t, char16_t und char32_t sein, da diese Typen nicht für die Arithmetik vorgesehen sind.

Parameter

x, y - Ganzzahlwerte

Rückgabewert

Gesättigte x × y.

Hinweise

Im Gegensatz zu den eingebauten arithmetischen Operatoren auf Ganzzahlen findet die Ganzzahlpromotion nicht auf die x- und y-Argumente Anwendung.

Wenn zwei Argumente unterschiedlichen Typs übergeben werden, schlägt der Aufruf beim Kompilieren fehl, d. h. das Verhalten bezüglich der Template-Argument-Deduktion ist dasselbe wie bei std::min oder std::max.

Die meisten modernen Hardware-Architekturen bieten effiziente Unterstützung für Sättigungsarithmetik auf SIMD-Vektoren, einschließlich SSE2 für x86 und NEON für ARM.

Feature-Test-Makro Wert Standard Merkmal
__cpp_lib_saturation_arithmetic 202311L (C++26) Sättigungsarithmetik
202603L (C++26) Umbenennung von Sättigungsarithmetik-Funktionen

Mögliche Implementierung

Siehe libstdc++ (GCC), libc++ (Clang).

Beispiel

Kann auf Compiler Explorer in der Vorschau angezeigt werden.

#include <climits>
#include <numeric>

static_assert
(""
    && (std::saturating_mul<int>(2, 3) == 6) // not saturated
    && (std::saturating_mul<int>(INT_MAX / 2, 3) == INT_MAX) // saturated
    && (std::saturating_mul<int>(-2, 3) == -6) // not saturated
    && (std::saturating_mul<int>(INT_MIN / -2, -3) == INT_MIN) // saturated
    && (std::saturating_mul<unsigned>(2, 3) == 6) // not saturated
    && (std::saturating_mul<unsigned>(UINT_MAX / 2, 3) == UINT_MAX) // saturated
);

int main() {}

Siehe auch

sättigende Additionsoperation auf zwei Ganzzahlen
(Funktionstemplate)
sättigende Subtraktionsoperation auf zwei Ganzzahlen
(Funktionstemplate)
sättigende Divisionsoperation auf zwei Ganzzahlen
(Funktionstemplate)
gibt einen Ganzzahlwert zurück, der auf den Bereich eines anderen Ganzzahltyps begrenzt ist
(Funktionstemplate)
(C++17)
begrenzt einen Wert zwischen zwei Grenzwerten
(Funktionstemplate & Algorithmus-Funktionsobjekt)
(C++20)
überprüft, ob ein Ganzzahlwert im Bereich eines bestimmten Ganzzahltyps liegt
(Funktionstemplate)
[statisch]
gibt den kleinsten endlichen Wert des gegebenen nicht-Gleitkommatyps zurück, oder den kleinsten positiven normalen Wert des gegebenen Gleitkommatyps
(öffentliche statische Mitgliedsfunktion von std::numeric_limits<T>)
[statisch]
gibt den größten endlichen Wert des gegebenen Typs zurück
(öffentliche statische Mitgliedsfunktion von std::numeric_limits<T>)

Externe Links

1.  Eine verzweigungsfreie Implementierung der Sättigungsarithmetik — Locklessinc.com, 2012