std::div_sat
From cppreference.com
| ヘッダー <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 であってはなりません。そうでない場合、動作は未定義です。未定義の動作が発生する場合、関数呼び出しは コア定数式ではありません。
このオーバーロードは、 T が整数型の場合にのみオーバーロード解決に参加します。つまり、 signed char、 short、 int、 long、 long long、拡張符号付き整数型、またはそれらの型の符号なしバージョンです。特に、これらの型は算術演算を意図されていないため、 (cv修飾されている可能性のある) bool、 char、 wchar_t、 char8_t、 char16_t、および char32_t は該当しません。
目次 |
[編集] パラメータ
| x, y | - | 整数値 |
[編集] 戻り値
飽和演算による x / y。
[編集] 注記
組み込みの整数演算子とは異なり、整数昇格はxおよびy引数には適用されません。
異なる型の2つの引数が渡された場合、コンパイルは失敗します。つまり、テンプレート引数推論に関する動作は、std::minまたはstd::maxの場合と同じです。
ほとんどの最新のハードウェアアーキテクチャは、x86用のSSE2やARM用のNEONなど、SIMDベクトル上の飽和算術演算に効率的なサポートを持っています。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__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. | A branch-free implementation of saturation arithmetic — Locklessinc.com, 2012 |
| 2. | C++ Weekly - Ep 459 - C++26's Saturating Math Operations — Youtube.com, 2024-12-16 |