std:: div_sat
|
Défini dans l'en-tête
<numeric>
|
||
|
template
<
class
T
>
constexpr T div_sat ( T x, T y ) noexcept ; |
(depuis C++26) | |
Calcule la division
saturante
x
/
y
. Si
T
est un type entier signé,
x
est la plus petite valeur (la plus négative) de
T
, et
y
==
-
1
, retourne la plus grande valeur de
T
; sinon, retourne
x
/
y
.
y ne doit pas être 0 , sinon le comportement est indéfini. L'appel de fonction n'est pas une expression constante de base si un comportement indéfini se produit.
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) | Saturation arithmetic |
Implémentation possible
namespace detail { template<class T> concept standard_or_extended_integral = std::is_integral_v<T> && !std::is_same_v<std::remove_cv_t<T>, bool> && !std::is_same_v<std::remove_cv_t<T>, char> && !std::is_same_v<std::remove_cv_t<T>, char8_t> && !std::is_same_v<std::remove_cv_t<T>, char16_t> && !std::is_same_v<std::remove_cv_t<T>, char32_t> && !std::is_same_v<std::remove_cv_t<T>, wchar_t>; } // namespace detail template<detail::standard_or_extended_integral T> constexpr T div_sat( T x, T y ) noexcept { if constexpr (std::is_signed_v<T>) if (x == std::numeric_limits<T>::min() && y == -1) return std::numeric_limits<T>::max(); return x / y; } |
Exemple
Peut être prévisualisé sur Compiler Explorer .
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 multiplication 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 |