名前空間
変種
操作

std::mul_sat

From cppreference.com
< cpp‎ | numeric
 
 
 
ヘッダー <numeric> で定義
template< class T >
constexpr T mul_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::mul_sat<int>(2, 3) == 6) // not saturated
    && (std::mul_sat<int>(INT_MAX / 2, 3) == INT_MAX) // saturated
    && (std::mul_sat<int>(-2, 3) == -6) // not saturated
    && (std::mul_sat<int>(INT_MIN / -2, -3) == INT_MIN) // saturated
    && (std::mul_sat<unsigned>(2, 3) == 6) // not saturated
    && (std::mul_sat<unsigned>(UINT_MAX / 2, 3) == UINT_MAX) // 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 日本語 中文(简体) 中文(繁體)