std::saturating_mul
| Определено в заголовке <numeric>
|
||
template< class T >
constexpr T saturating_mul( T x, T y ) noexcept;
|
(начиная с C++26) | |
Вычисляет насыщающее умножение x × y. Эта операция (в отличие от встроенных арифметических операций над целыми числами) ведёт себя так, как если бы она была математической операцией с бесконечным диапазоном. Пусть q обозначает результат такой операции.
Возвращает:
q, еслиqпредставимо в виде значения типаT. В противном случае –- наибольшее или наименьшее значение типа
T, то, которое ближе кq.
Эта перегрузка участвует в разрешении перегрузок только если T является целым типом, то есть: signed char, short, int, long, long long, расширенным знаковым целым типом или беззнаковой версией таких типов. В частности, T не должен быть (возможно, cv-квалифицированным) bool, char, wchar_t, char8_t, char16_t и char32_t, так как эти типы не предназначены для арифметики.
Параметры
| x, y | - | целые значения |
Возвращаемое значение
Насыщенное x × y.
Примечания
В отличие от встроенных арифметических операторов над целыми числами, продвижение целых типов не применяется к аргументам x и y.
Если передаются два аргумента разных типов, вызов не компилируется; поведение относительно вывода аргументов шаблона такое же, как для std::min или std::max.
Большинство современных аппаратных архитектур имеют эффективную поддержку арифметики с насыщением для SIMD-векторов, включая SSE2 для x86 и NEON для ARM.
| Макрос проверки возможности | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_saturation_arithmetic |
202311L |
(C++26) | Арифметика с насыщением |
202603L |
(C++26) | Переименование функций арифметики с насыщением |
Возможная реализация
См. libstdc++ (GCC), libc++ (Clang).
Пример
Можно просмотреть на 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() {}
Смотри также
(C++26) |
операция насыщающего сложения двух целых чисел (шаблон функции) |
(C++26) |
операция насыщающего вычитания двух целых чисел (шаблон функции) |
(C++26) |
операция насыщающего деления двух целых чисел (шаблон функции) |
(C++26) |
возвращает целое значение, ограниченное диапазоном другого целого типа (шаблон функции) |
(C++17) |
ограничивает значение между парой граничных значений (шаблон функции & объект-функция алгоритма) |
(C++20) |
|
(C++20) |
проверяет, находится ли целое значение в диапазоне данного целого типа (шаблон функции) |
[static] |
возвращает наименьшее конечное значение данного не вещественного типа, или наименьшее положительное нормальное значение данного вещественного типа (открытая статическая функция-элемент std::numeric_limits<T>)
|
[static] |
возвращает наибольшее конечное значение данного типа (открытая статическая функция-элемент std::numeric_limits<T>)
|
Внешние ссылки
| 1. | Реализация арифметики с насыщением без ветвлений — Locklessinc.com, 2012 |