std::saturating_sub
| 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, siqest représentable comme une valeur de typeT. Sinon,- la plus grande ou la plus petite valeur de type
T, selon celle qui est la plus proche de laq.
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
(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) |
(C++26) |
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) |
|
(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 |