std:: div_sat
|
定義先ヘッダ
<numeric>
|
||
|
template
<
class
T
>
constexpr T div_sat ( T x, T y ) noexcept ; |
(C++26以降) | |
飽和
除算
x
/
y
を計算します。
T
が符号付き整数型であり、
x
が
T
の最小値(最も負の値)で、
y
==
-
1
の場合、
T
の最大値を返します。それ以外の場合は、
x
/
y
を返します。
y は 0 であってはならず、そうでない場合の動作は未定義です。未定義動作が発生した場合、この関数呼び出しは core constant expression ではありません。
このオーバーロードは、
T
が
整数型
である場合にのみ、オーバーロード解決に参加します。すなわち:
signed
char
、
short
、
int
、
long
、
long
long
、拡張符号付き整数型、またはこれらの型の符号なしバージョンです。特に、
T
は(CV修飾された可能性のある)
bool
、
char
、
wchar_t
、
char8_t
、
char16_t
、および
char32_t
であってはなりません。これらの型は算術演算を意図していないためです。
目次 |
パラメータ
| x, y | - | 整数値 |
戻り値
飽和 x / y .
注記
組み込みの整数演算子とは異なり、 integral promotion は x および y 引数には適用されません。
異なる型の2つの引数が渡された場合、その呼び出しはコンパイルに失敗します。つまり、 テンプレート引数推論 に関する動作は、 std::min や std::max と同じです。
最新のハードウェアアーキテクチャの多くは、 SIMDベクトル に対する飽和演算を効率的にサポートしています。これには、 x86 向けの SSE2 や、 ARM 向けの NEON が含まれます。
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_saturation_arithmetic
|
202311L
|
(C++26) | 飽和算術演算 |
実装例
namespace detail { template<class T> concept standard_or_extended_integral = std::is_integral_v<T> && !std::is_same_v<std::remove_cv_t<T>, bool> && !std::is_same_v<std::remove_cv_t<T>, char> && !std::is_same_v<std::remove_cv_t<T>, char8_t> && !std::is_same_v<std::remove_cv_t<T>, char16_t> && !std::is_same_v<std::remove_cv_t<T>, char32_t> && !std::is_same_v<std::remove_cv_t<T>, wchar_t>; } // namespace detail template<detail::standard_or_extended_integral T> constexpr T div_sat( T x, T y ) noexcept { if constexpr (std::is_signed_v<T>) if (x == std::numeric_limits<T>::min() && y == -1) return std::numeric_limits<T>::max(); return x / y; } |
例
Compiler Explorer でプレビューできます。
関連項目
|
(C++26)
|
2つの整数に対する飽和加算演算
(関数テンプレート) |
|
(C++26)
|
2つの整数に対する飽和減算演算
(関数テンプレート) |
|
(C++26)
|
2つの整数に対する飽和乗算演算
(関数テンプレート) |
|
(C++26)
|
別の整数型の範囲にクランプされた整数値を返す
(関数テンプレート) |
|
(C++17)
|
値を境界値のペアの間でクランプする
(関数テンプレート) |
|
(C++20)
|
整数値が指定された整数型の範囲内にあるかどうかをチェックする
(関数テンプレート) |
|
[static]
|
指定された非浮動小数点型の最小有限値、または指定された浮動小数点型の最小正規化値を返す
(
std::numeric_limits<T>
のpublic staticメンバ関数)
|
|
[static]
|
指定された型の最大有限値を返す
(
std::numeric_limits<T>
のpublic staticメンバ関数)
|
外部リンク
| 1. | 飽和演算の分岐なし実装 — Locklessinc.com, 2012 |
| 2. | C++ Weekly - Ep 459 - C++26の飽和数学演算 — Youtube.com, 2024-12-16 |