std::saturating_mul
| Défini dans l'en-tête <numeric>
|
||
template< class T >
constexpr T saturating_mul( T x, T y ) noexcept;
|
(depuis C++26) | |
Calcule la multiplication saturante x × y. Cette opération (contrairement aux opérations arithmétiques intégrées sur les entiers) se comporte comme si elle était une opération mathématique avec un intervalle infini. 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.
Paramètres
| x, y | - | valeurs entières |
Valeur de retour
x × y saturé.
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 template est le même que pour std::min ou std::max.
La plupart des architectures matérielles modernes prennent en charge efficacement l'arithmétique de saturation 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 de saturation |
202603L |
(C++26) | Renommage des fonctions d'arithmétique de saturation |
Implémentation possible
Voir libstdc++ (GCC), libc++ (Clang).
Exemple
Peut être prévisualisé sur Compiler Explorer.
#include <climits>
#include <numeric>
static_assert
(""
&& (std::saturating_mul<int>(2, 3) == 6) // not saturated
&& (std::saturating_mul<int>(INT_MAX / 2, 3) == INT_MAX) // saturated
&& (std::saturating_mul<int>(-2, 3) == -6) // not saturated
&& (std::saturating_mul<int>(INT_MIN / -2, -3) == INT_MIN) // saturated
&& (std::saturating_mul<unsigned>(2, 3) == 6) // not saturated
&& (std::saturating_mul<unsigned>(UINT_MAX / 2, 3) == UINT_MAX) // saturated
);
int main() {}
Voir aussi
(C++26) |
opération d'addition saturante sur deux entiers (modèle de fonction) |
(C++26) |
opération de soustraction 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 à l'intervalle 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 l'intervalle d'un type entier donné (modèle de fonction) |
[static] |
retourne la plus petite valeur finie du type non à virgule flottante 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 branchement de l'arithmétique de saturation — Locklessinc.com, 2012 |