std::midpoint

来自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 的中点。

参数

a, b - 整数、浮点或指针值
类型要求
-
对于重载 (1)T 必须是 bool 外的算术类型
-
对于重载 (2)T 必须是完整对象类型

返回值

1) ab 和的一半。不出现上溢。若 ab 拥有整数类型而和为奇数,则向 a 取整结果。若 ab 拥有浮点类型,则至多出现一次不准确运算。
2)ab 分别指向(就指针算术目的而言的)同一数组对象 xx[i]x[j] ,则返回指向 x[i+(j-i)/2] 的指针,其中除法向零取整。若 ab 不指向同一数组对象,则行为未定义。

异常

不抛异常。

示例

#include <cstdint>
#include <limits>
#include <numeric>
#include <iostream>
 
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';
}

可能的输出:

a: 4294967295
b: 4294967293
Incorrect (overflow and wrapping): 2147483646
Correct: 4294967294