Namespaces
Variants

std::saturating_mul

De fr.cppreference.net
 
 
 
 
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, 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.

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

opération d'addition saturante sur deux entiers
(modèle de fonction)
opération de soustraction 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 à 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)
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