名前空間
変種
操作

std::sub_sat

From cppreference.com
< cpp‎ | numeric
 
 
 
ヘッダー <numeric> で定義
template< class T >
constexpr T sub_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 <numeric>
 
static_assert
(""
    && (std::sub_sat<int>(INT_MIN + 4, 3) == INT_MIN + 1) // not saturated
    && (std::sub_sat<int>(INT_MIN + 4, 5) == INT_MIN) // saturated
    && (std::sub_sat<int>(INT_MAX - 4, -3) == INT_MAX - 1) // not saturated
    && (std::sub_sat<int>(INT_MAX - 4, -5) == INT_MAX) // saturated
    && (std::sub_sat<unsigned>(4, 3) == 1) // not saturated
    && (std::sub_sat<unsigned>(4, 5) == 0) // 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 日本語 中文(简体) 中文(繁體)