Namespaces
Variants

std:: midpoint

From cppreference.net
定義先ヘッダ <numeric>
template < class T >
constexpr T midpoint ( T a, T b ) noexcept ;
(1) (C++20以降)
template < class T >
constexpr T * midpoint ( T * a, T * b ) ;
(2) (C++20以降)

整数、浮動小数点数、またはポインタ a b の中点を計算します。

1) このオーバーロードは、 T bool 以外の算術型である場合にのみ、オーバーロード解決に参加します。
2) このオーバーロードは、 T がオブジェクト型の場合にのみオーバーロード解決に参加します。 T 不完全型 の場合、このオーバーロードの使用は不適格です。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、
タグ内のテキストは翻訳していません
- C++固有の用語(Parameters、Return value、Exceptions、Notes、Example、References、See also)は原文のまま保持しました
- 番号付けと書式は完全に保持されています

パラメータ

a, b - 整数、浮動小数点数、またはポインタ値

戻り値

1) a b の合計の半分。オーバーフローは発生しない。 a b が整数型で合計が奇数の場合、結果は a の方向に丸められる。 a b が浮動小数点型の場合、最大1回の不正確演算が発生する。
2) もし a b がそれぞれ同じ配列オブジェクト x x [ i ] x [ j ] を指す場合( ポインタ算術 の目的で)、 x [ i + ( j - i ) / 2 ] へのポインタを返す(または同等に x [ std :: midpoint ( i, j ) ] )。ここで除算はゼロ方向への丸めを行う。 a b が同じ配列オブジェクトの要素を指していない場合、動作は未定義である。

例外

例外を送出しません。

注記

オーバーロード (2) は、一般的なプラットフォームでは return a + ( b - a ) / 2 ; として単純に実装できます。しかし、このような実装は移植性が保証されません。なぜなら、要素数が PTRDIFF_MAX より大きい配列を作成可能なプラットフォームが存在する可能性があり、 b - a が未定義動作を引き起こす可能性があるためです。たとえ b a が同じ配列内の要素を指している場合でも同様です。

機能テスト マクロ 標準 機能
__cpp_lib_interpolate 201902L (C++20) std::lerp , std::midpoint

#include <cstdint>
#include <iostream>
#include <limits>
#include <numeric>
int main()
{
    std::uint32_t a = std::numeric_limits<std::uint32_t>::max();
    std::uint32_t b = std::numeric_limits<std::uint32_t>::max() - 2;
    std::cout << "a: " << a << '\n'
              << "b: " << b << '\n'
              << "Incorrect (overflow and wrapping): " << (a + b) / 2 << '\n'
              << "Correct: " << std::midpoint(a, b) << "\n\n";
    auto on_pointers = [](int i, int j)
    {
        char const* text = "0123456789";
        char const* p = text + i;
        char const* q = text + j;
        std::cout << "std::midpoint('" << *p << "', '" << *q << "'): '"
                  << *std::midpoint(p, q) << "'\n";
    };
    on_pointers(2, 4);
    on_pointers(2, 5);
    on_pointers(5, 2);
    on_pointers(2, 6);
}

出力:

a: 4294967295
b: 4294967293
Incorrect (overflow and wrapping): 2147483646
Correct: 4294967294
std::midpoint('2', '4'): '3'
std::midpoint('2', '5'): '3'
std::midpoint('5', '2'): '4'
std::midpoint('2', '6'): '4'

参考文献

  • C++23標準 (ISO/IEC 14882:2024):
  • 27.10.16 ミッドポイント [numeric.ops.midpoint]
  • C++20標準 (ISO/IEC 14882:2020):
  • 25.10.15 ミッドポイント [numeric.ops.midpoint]

関連項目

(C++20)
線形補間関数
(関数)