Namespaces
Variants

std:: mul_sat

From cppreference.net
Saturation arithmetic
Functions
(C++26)
(C++26)
mul_sat
(C++26)
(C++26)
ヘッダーで定義 <numeric>
template < class T >
constexpr T mul_sat ( T x, T y ) noexcept ;
(C++26以降)

飽和 乗算 x × y を計算します。この演算は(組み込みの 整数演算 とは異なり)数学的な 無限 範囲を持つ演算として振る舞います。 q をそのような演算の結果とします。 戻り値:

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

このオーバーロードは、 T 整数型 である場合にのみ、オーバーロード解決に参加します。すなわち: signed char short int long long long 、拡張符号付き整数型、またはこれらの型の符号なしバージョンです。特に、 T は(CV修飾された可能性のある) bool char wchar_t char8_t char16_t 、および char32_t であってはなりません。これらの型は算術演算を意図していないためです。

目次

パラメータ

x, y - 整数値

戻り値

飽和 x × y .

注記

組み込みの整数演算子とは異なり、 integral promotion x および y 引数には適用されません。

異なる型の2つの引数が渡された場合、その呼び出しはコンパイルに失敗します。つまり、 テンプレート引数推論 に関する動作は、 std::min std::max と同じです。

最新のハードウェアアーキテクチャの多くは、 SIMDベクトル に対する飽和演算を効率的にサポートしています。これには x86 向けの SSE2 や、 ARM 向けの NEON が含まれます。

機能テスト マクロ 標準 機能
__cpp_lib_saturation_arithmetic 202311L (C++26) 飽和算術演算

実装例

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

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

#include <climits>
#include <numeric>
static_assert
(""
    && (std::mul_sat<int>(2, 3) == 6) // 飽和していない
    && (std::mul_sat<int>(INT_MAX / 2, 3) == INT_MAX) // 飽和
    && (std::mul_sat<int>(-2, 3) == -6) // 飽和していない
    && (std::mul_sat<int>(INT_MIN / -2, -3) == INT_MIN) // 飽和
    && (std::mul_sat<unsigned>(2, 3) == 6) // 飽和していない
    && (std::mul_sat<unsigned>(UINT_MAX / 2, 3) == UINT_MAX) // 飽和
);
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