std::midpoint
From cppreference.com
| ヘッダー <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 以外の算術型の場合にのみオーバーロード解決に参加します。目次 |
[編集] パラメータ
| 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 standard (ISO/IEC 14882:2020)
- 25.10.15 中間点 [numeric.ops.midpoint]
[編集] 関連項目
| (C++20) |
線形補間関数 (関数) |