std::mul_sat
Определено в заголовочном файле <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.
Если переданы два аргумента разного типа, вызов не компилируется, т.е. поведение относительно вывода шаблонов аргументов такое же, как для 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) // not saturated
&& (std::mul_sat<int>(INT_MAX / 2, 3) == INT_MAX) // saturated
&& (std::mul_sat<int>(-2, 3) == -6) // not saturated
&& (std::mul_sat<int>(INT_MIN / -2, -3) == INT_MIN) // saturated
&& (std::mul_sat<unsigned>(2, 3) == 6) // not saturated
&& (std::mul_sat<unsigned>(UINT_MAX / 2, 3) == UINT_MAX) // saturated
);
int main() {}См. также
|
(C++26) | насыщающая операция сложения двух целых чисел (шаблон функции) |
|
(C++26) | насыщающая операция вычитания двух целых чисел (шаблон функции) |
|
(C++26) | насыщающая операция деления двух целых чисел (шаблон функции) |
|
(C++26) | возвращает целочисленное значение, ограниченное диапазоном другого целочисленного типа (шаблон функции) |
|
(C++17) | ограничивает значение между двумя граничными значениями (шаблон функции) |
|
(C++20) | проверяет, находится ли целочисленное значение в диапазоне заданного целочисленного типа (шаблон функции) |
|
[статический] | возвращает наименьшее конечное значение заданного типа (общедоступный статический член функции std::numeric_limits<T>) |
|
[статический] | возвращает наибольшее конечное значение заданного типа (общедоступный статический член функции std::numeric_limits<T>) |
Внешние ссылки
| 1. | Безусловное реализация насыщающей арифметики — Locklessinc.com, 2012 |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/mul_sat