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 불완전 타입 인 경우 이 오버로드의 사용은 형식이 잘못되었습니다.

목차

매개변수

a, b - 정수, 부동 소수점 또는 포인터 값

반환값

1) a b 의 합의 절반. 오버플로가 발생하지 않습니다. 만약 a b 가 정수 타입이고 합이 홀수인 경우, 결과는 a 방향으로 반올림됩니다. 만약 a b 가 부동소수점 타입인 경우, 최대 하나의 부정확한 연산이 발생합니다.
2) 만약 a b 가 동일한 배열 객체 x 의 각각 x [ i ] x [ j ] 를 가리키는 경우( 포인터 산술 목적상), x [ i + ( j - i ) / 2 ] (또는 동등하게 x [ std :: midpoint ( i, j ) ] )를 가리키는 포인터를 반환하며, 여기서 나눗셈은 0 방향으로 반올림합니다. 만약 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'
              << "잘못된 계산 (오버플로 및 래핑): " << (a + b) / 2 << '\n'
              << "올바른 계산: " << 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)
선형 보간 함수
(함수)