Namespaces
Variants

std::saturating_mul

От ru.cppreference.net
 
 
 
 
Определено в заголовке <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++17)
ограничивает значение между парой граничных значений
(шаблон функции & объект-функция алгоритма)
(C++20)
проверяет, находится ли целое значение в диапазоне данного целого типа
(шаблон функции)
[static]
возвращает наименьшее конечное значение данного не вещественного типа, или наименьшее положительное нормальное значение данного вещественного типа
(открытая статическая функция-элемент std::numeric_limits<T>)
[static]
возвращает наибольшее конечное значение данного типа
(открытая статическая функция-элемент std::numeric_limits<T>)

Внешние ссылки

1.  Реализация арифметики с насыщением без ветвлений — Locklessinc.com, 2012