名前空間
変種
操作

std::midpoint

From cppreference.com
< cpp‎ | numeric
 
 
 
ヘッダー <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以降)

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

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

目次

[編集] パラメータ

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

[編集] 戻り値

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

[編集] 例外

例外を投げません。

[編集] 備考

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

機能テストマクロ 規格 機能
__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 standard (ISO/IEC 14882:2020)
  • 25.10.15 中間点 [numeric.ops.midpoint]

[編集] 関連項目

(C++20)
線形補間関数
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)