Namespaces
Variants

std:: sub_sat

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

Calcule la soustraction saturante x - y . Cette opération (contrairement aux opérations arithmétiques intégrées sur les entiers ) se comporte comme s'il s'agissait d'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 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.

Table des matières

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'arguments de template est le même que pour std::min ou std::max .

La plupart des architectures matérielles modernes disposent d'une prise en charge efficace de l'arithmétique de saturation pour les vecteurs SIMD , incluant SSE2 pour x86 et NEON pour ARM .

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_saturation_arithmetic 202311L (C++26) Arithmétique de saturation

Implémentation possible

Voir libstdc++ (gcc) .

Exemple

Peut être prévisualisé sur Compiler Explorer

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

Voir aussi

(C++26)
opération d'addition saturante sur deux entiers
(modèle de fonction)
(C++26)
opération de multiplication saturante sur deux entiers
(modèle de fonction)
(C++26)
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)
(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 flottant donné
(fonction membre publique statique de std::numeric_limits<T> )
[static]
retourne la plus grande valeur finie du type donné
(fonction membre publique statique de std::numeric_limits<T> )

Liens externes

1. Une implémentation sans branchement de l'arithmétique de saturation — Locklessinc.com, 2012
2. C++ Weekly - Ep 459 - Les opérations mathématiques de saturation de C++26 — Youtube.com, 2024-12-16