Namespaces
Variants

std::saturating_sub

De fr.cppreference.net
 
 
 
 
Défini dans l'en-tête <numeric>
template< class T >
constexpr T saturating_sub( T x, T y ) noexcept;
(depuis C++26)

Calcule la sous-traction saturantex - y. Cette opération (contrairement aux opérations arithmétiques intégrées sur les entiers) se comporte comme une opération mathématique avec une plage infinie. Soit q le résultat d'une telle opération. Retourne :

  • q, si q est représentable comme une valeur de type T. Sinon,
  • la plus grande ou la plus petite valeur de type T, selon celle qui est la plus proche de la q.

Cette surcharge participe à la résolution de surcharge uniquement si T est un type entier, c'est-à-dire : signed char, short, int, long, long long, un type entier signé étendu, ou une version non signée de ces types. En particulier, T ne doit pas être (éventuellement qualifié cv) bool, char, wchar_t, char8_t, char16_t, et char32_t, car ces types ne sont pas destinés à l'arithmétique.

Paramètres

x, y - valeurs entières

Valeur de retour

Saturé x - y.

Notes

Contrairement aux opérateurs arithmétiques intégrés sur les entiers, la promotion intégrale ne s'applique pas aux arguments x et y.

Si deux arguments de types différents sont passés, l'appel échoue à la compilation, c'est-à-dire que le comportement relatif à la déduction d'argument de modèle est le même que pour std::min ou std::max.

La plupart des architectures matérielles modernes offrent un support efficace pour l'arithmétique saturante sur les vecteurs SIMD, y compris SSE2 pour x86 et NEON pour ARM.

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_saturation_arithmetic 202311L (C++26) Arithmétique saturante
202603L (C++26) Renommage des fonctions d'arithmétique saturante

Implémentation possible

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

Exemple

Peut être prévisualisé sur 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() {}

Voir aussi

opération d'addition saturante sur deux entiers
(modèle de fonction)
opération de multiplication saturante sur deux entiers
(modèle de fonction)
opération de division saturante sur deux entiers
(modèle de fonction)
retourne une valeur entière limitée à la plage d'un autre type entier
(modèle de fonction)
(C++17)
limite une valeur entre une paire de valeurs limites
(modèle de fonction & objet fonction d'algorithme)
(C++20)
vérifie si une valeur entière est dans la plage d'un type entier donné
(modèle de fonction)
[static]
retourne la plus petite valeur finie du type non flottant donné, ou la plus petite valeur normale positive du type à virgule flottante donné
(fonction membre statique publique de std::numeric_limits<T>)
[static]
retourne la plus grande valeur finie du type donné
(fonction membre statique publique de std::numeric_limits<T>)

Liens externes

1.  Une implémentation sans branche de l'arithmétique saturante — Locklessinc.com, 2012