std:: sub_sat
|
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, 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 deq.
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) |
|
(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) |
|
(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 |