名前空間
変種
操作

std::div_sat

From cppreference.com
< cpp‎ | numeric
 
 
 
ヘッダー <numeric> で定義
template< class T >
constexpr T div_sat( T x, T y ) noexcept;
(C++26以降)

飽和演算による除算 x / y を計算します。 T が符号付き整数型で、 xT の最小値(最も負の値)で、かつ y == -1 の場合、 T の最大値を返します。それ以外の場合は、 x / y を返します。

y0 であってはなりません。そうでない場合、動作は未定義です。未定義の動作が発生する場合、関数呼び出しは コア定数式ではありません。

このオーバーロードは、 T整数型の場合にのみオーバーロード解決に参加します。つまり、 signed charshortintlonglong long、拡張符号付き整数型、またはそれらの型の符号なしバージョンです。特に、これらの型は算術演算を意図されていないため、 (cv修飾されている可能性のある) boolcharwchar_tchar8_tchar16_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 でプレビューできます。

#include <climits>
#include <numeric>
 
static_assert
(""
    && (std::div_sat<int>(6, 3) == 2) // not saturated
    && (std::div_sat<int>(INT_MIN, -1) == INT_MAX) // saturated
    && (std::div_sat<unsigned>(6, 3) == 2) // not saturated
);
 
int main() {}

[編集] 関連項目

(C++26)
2つの整数に対する飽和加算操作
(関数テンプレート) [編集]
(C++26)
2つの整数に対する飽和減算操作
(関数テンプレート) [編集]
(C++26)
2つの整数に対する飽和乗算操作
(関数テンプレート) [編集]
別の整数型の範囲にクランプされた整数値を返す
(関数テンプレート) [編集]
(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
English 日本語 中文(简体) 中文(繁體)