namespace std {
template<class T>
constexpr T saturating_div(T x, T y) noexcept;
}
概要
飽和除算 x / y を計算する。
テンプレートパラメータ制約
Tは符号付き整数型または符号無し整数型であること。
事前条件
y != 0
戻り値
Tが符号付き整数型かつx == numeric_limits<T>::min() && y == -1のとき、numeric_limits<T>::max()を返す- そうでなければ、
x / yを返す
例外
投げない
定数式に評価される条件
事前条件を満たすこと
例
#include <cstdint>
#include <numeric>
#include <print>
int main()
{
// 10 / 3 = 3
std::println("{}", std::saturating_div(10, 3));
// -128 * -1 = 128 -> 127(2**7-1)
std::int8_t x = -128, y = -1;
std::println("{}", std::saturating_div(x, y));
}
出力
3
127
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??
参照
- P0543R3 Saturation arithmetic
- LWG Issue 4030. Clarify whether arithmetic expressions in [numeric.sat.func] are mathematical or C++
- C++26で、飽和演算関数の算術演算が無限精度の数学的演算として行われることが明確化された(cpprefjpでは既に「無限の範囲で計算した値」と記述している)
- P4052R0 Renaming saturation arithmetic functions