名前空間
変種
操作

std::add_sat

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

x + y を計算する飽和加算を実行します。この演算は(組み込みの整数演算とは異なり)、あたかも無限の範囲を持つ数学的な演算であるかのように振る舞います。このような演算の結果をqとします。以下を返します。

  • q が型Tの値として表現可能である場合は、q
  • それ以外の場合は、型Tの最大値または最小値のうち、qに最も近い方。

このオーバーロードは、T整数型である場合のみ、オーバーロード解決に参加します。つまり、signed charshortintlonglong long、拡張符号付き整数型、またはそれらの符号なしバージョンです。特に、Tは(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) 飽和演算

[編集] 実装例

libstdc++ (gcc)を参照してください。

[編集]

Compiler Explorerでプレビューできます。

#include <climits>
#include <limits>
#include <numeric>
 
static_assert(CHAR_BIT == 8);
static_assert(UCHAR_MAX == 255);
 
int main()
{
    constexpr int a = std::add_sat(3, 4); // no saturation occurs, T = int
    static_assert(a == 7);
 
    constexpr unsigned char b = std::add_sat<unsigned char>(UCHAR_MAX, 4); // saturated
    static_assert(b == UCHAR_MAX);
 
    constexpr unsigned char c = std::add_sat(UCHAR_MAX, 4); // not saturated, T = int
        // add_sat(int, int) returns int tmp == 259,
        // then assignment truncates 259 % 256 == 3
    static_assert(c == 3);
 
//  unsigned char d = std::add_sat(252, c); // Error: inconsistent deductions for T
 
    constexpr unsigned char e = std::add_sat<unsigned char>(251, a); // saturated
    static_assert(e == UCHAR_MAX);
        // 251 is of type T = unsigned char, `a` is converted to unsigned char value;
        // might yield an int -> unsigned char conversion warning for `a`
 
    constexpr signed char f = std::add_sat<signed char>(-123, -3); // not saturated
    static_assert(f == -126);
 
    constexpr signed char g = std::add_sat<signed char>(-123, -13); // saturated
    static_assert(g == std::numeric_limits<signed char>::min()); // g == -128
}

[編集] 関連項目

(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 日本語 中文(简体) 中文(繁體)