Namespaces
Variants

std:: mul_sat

From cppreference.net
Saturation arithmetic
Functions
(C++26)
(C++26)
mul_sat
(C++26)
(C++26)
Определено в заголовке <numeric>
template < class T >
constexpr T mul_sat ( 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 .

Если передаются два аргумента разного типа, вызов не компилируется, т.е. поведение относительно template argument deduction такое же, как для std::min или std::max .

Большинство современных аппаратных архитектур имеют эффективную поддержку насыщающей арифметики для SIMD векторов , включая SSE2 для x86 и NEON для ARM .

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_saturation_arithmetic 202311L (C++26) Арифметика с насыщением

Возможная реализация

См. libstdc++ (gcc) .

Пример

Может быть просмотрено на Compiler Explorer .

#include <climits>
#include <numeric>
static_assert
(""
    && (std::mul_sat<int>(2, 3) == 6) // не насыщенное
    && (std::mul_sat<int>(INT_MAX / 2, 3) == INT_MAX) // насыщенное
    && (std::mul_sat<int>(-2, 3) == -6) // не насыщенное
    && (std::mul_sat<int>(INT_MIN / -2, -3) == INT_MIN) // насыщенное
    && (std::mul_sat<unsigned>(2, 3) == 6) // не насыщенное
    && (std::mul_sat<unsigned>(UINT_MAX / 2, 3) == UINT_MAX) // насыщенное
);
int main() {}

Смотрите также

(C++26)
операция насыщающего сложения двух целых чисел
(шаблон функции)
(C++26)
операция насыщающего вычитания двух целых чисел
(шаблон функции)
(C++26)
операция насыщающего деления двух целых чисел
(шаблон функции)
возвращает целочисленное значение, ограниченное диапазоном другого целочисленного типа
(шаблон функции)
(C++17)
ограничивает значение между парой граничных значений
(шаблон функции)
(C++20)
проверяет, находится ли целочисленное значение в диапазоне заданного целочисленного типа
(шаблон функции)
[static]
возвращает наименьшее конечное значение заданного не-вещественного типа или наименьшее положительное нормализованное значение заданного вещественного типа
(открытая статическая функция-член std::numeric_limits<T> )
[static]
возвращает наибольшее конечное значение заданного типа
(открытая статическая функция-член std::numeric_limits<T> )

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

1. Безусловная реализация насыщающей арифметики — Locklessinc.com, 2012
2. C++ Weekly - Эпизод 459 - Насыщающие математические операции в C++26 — Youtube.com, 2024-12-16