Namespaces
Variants

std::saturating_sub

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

Berechnet die sättigende Subtraktion x - y. Diese Operation (anders als eingebaute arithmetische Operationen auf ganzen Zahlen) verhält sich, als ob sie eine mathematische Operation mit einem unendlichen Bereich wäre. Sei q das Ergebnis einer solchen Operation. Rückgabewert:

  • q, wenn q als Wert des Typs T darstellbar ist. Andernfalls
  • der größte oder kleinste Wert des Typs T, je nachdem welcher näher an q liegt.

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn T ein ganzzahliger Typ 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 Arithmetik vorgesehen sind.

Parameter

x, y - ganzzahlige Werte

Rückgabewert

Sättigungs-x - y.

Anmerkungen

Anders als bei den eingebauten arithmetischen Operatoren auf ganzen Zahlen findet die integrale Promotion nicht auf die x und y Argumente statt.

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

Die meisten modernen Hardwarearchitekturen haben 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 Std Funktion
__cpp_lib_saturation_arithmetic 202311L (C++26) Sättigungsarithmetik
202603L (C++26) Umbenennung von Sättigungsarithmetikfunktionen

Mögliche Implementierung

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

Beispiel

Kann auf Compiler Explorer

#include <climits>
#include <numeric>
 
static_assert
(""
    && (std::saturating_sub<int>(INT_MIN + 4, 3) == INT_MIN + 1) // not saturated
    && (std::saturating_sub<int>(INT_MIN + 4, 5) == INT_MIN) // saturated
    && (std::saturating_sub<int>(INT_MAX - 4, -3) == INT_MAX - 1) // not saturated
    && (std::saturating_sub<int>(INT_MAX - 4, -5) == INT_MAX) // saturated
    && (std::saturating_sub<unsigned>(4, 3) == 1) // not saturated
    && (std::saturating_sub<unsigned>(4, 5) == 0) // saturated
);

int main() {}

Siehe auch

sättigende Additionsoperation auf zwei ganzen Zahlen
(Funktionstemplate)
sättigende Multiplikationsoperation auf zwei ganzen Zahlen
(Funktionstemplate)
sättigende Divisionsoperation auf zwei ganzen Zahlen
(Funktionstemplate)
gibt einen ganzzahligen Wert zurück, der auf den Bereich eines anderen ganzzahligen Typs begrenzt ist
(Funktionstemplate)
(C++17)
begrenzt einen Wert zwischen zwei Grenzwerten
(Funktionstemplate & Algorithmusfunktionsobjekt)
(C++20)
prüft, ob ein ganzzahliger Wert im Bereich eines gegebenen ganzzahligen Typs liegt
(Funktionstemplate)
[static]
gibt den kleinsten endlichen Wert des gegebenen Nicht-Gleitkommatyps oder den kleinsten positiven normalen Wert des gegebenen Gleitkommatyps zurück
(öffentliche statische Memberfunktion von std::numeric_limits<T>)
[static]
gibt den größten endlichen Wert des gegebenen Typs zurück
(öffentliche statische Memberfunktion von std::numeric_limits<T>)

Externe Links

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