complex_operator_arith3

complex_operator_arith3 (복소수 이항 산술 연산자)

복소수에 대한 이항 산술 연산자(+, -, *, /)를 구현해요. 복소수와 스칼라(같은 타입)를 섞어 쓸 수 있어요. C++20부터 constexpr이에요.

출처: cppreference

본문

시그니처는 다음과 같아요.

template< class T >
std::complex<T> operator+( const std::complex<T>& lhs,
                           const std::complex<T>& rhs );

(1) (until C++20)

template< class T >
constexpr std::complex<T> operator+( const std::complex<T>& lhs,
                                     const std::complex<T>& rhs );

(since C++20)

template< class T >
std::complex<T> operator+( const std::complex<T>& lhs,
                           const T& rhs );

(2) (until C++20)

template< class T >
constexpr std::complex<T> operator+( const std::complex<T>& lhs,
                                     const T& rhs );

(since C++20)

template< class T >
std::complex<T> operator+( const T& lhs,
                           const std::complex<T>& rhs );

(3) (until C++20)

template< class T >
constexpr std::complex<T> operator+( const T& lhs,
                                     const std::complex<T>& rhs );

(since C++20)

template< class T >
std::complex<T> operator-( const std::complex<T>& lhs,
                           const std::complex<T>& rhs );

(4) (until C++20)

template< class T >
constexpr std::complex<T> operator-( const std::complex<T>& lhs,
                                     const std::complex<T>& rhs );

(since C++20)

template< class T >
std::complex<T> operator-( const std::complex<T>& lhs,
                           const T& rhs );

(5) (until C++20)

template< class T >
constexpr std::complex<T> operator-( const std::complex<T>& lhs,
                                     const T& rhs );

(since C++20)

template< class T >
std::complex<T> operator-( const T& lhs,
                           const std::complex<T>& rhs );

(6) (until C++20)

template< class T >
constexpr std::complex<T> operator-( const T& lhs,
                                     const std::complex<T>& rhs );

(since C++20)

template< class T >
std::complex<T> operator*( const std::complex<T>& lhs,
                           const std::complex<T>& rhs );

(7) (until C++20)

template< class T >
constexpr std::complex<T> operator*( const std::complex<T>& lhs,
                                     const std::complex<T>& rhs );

(since C++20)

template< class T >
std::complex<T> operator*( const std::complex<T>& lhs,
                           const T& rhs );

(8) (until C++20)

template< class T >
constexpr std::complex<T> operator*( const std::complex<T>& lhs,
                                     const T& rhs );

(since C++20)

template< class T >
std::complex<T> operator*( const T& lhs,
                           const std::complex<T>& rhs );

(9) (until C++20)

template< class T >
constexpr std::complex<T> operator*( const T& lhs,
                                     const std::complex<T>& rhs );

(since C++20)

template< class T >
std::complex<T> operator/( const std::complex<T>& lhs,
                           const std::complex<T>& rhs );

(10) (until C++20)

template< class T >
constexpr std::complex<T> operator/( const std::complex<T>& lhs,
                                     const std::complex<T>& rhs );

(since C++20)

(나머지 / 연산자 오버로드 (11)(12)도 동일한 형태로 복소수-스칼라, 스칼라-복소수 조합을 지원해요.)

반환값 (Return value)

  • 1-3) std::complex<T>(lhs) += rhs
  • 4-6) std::complex<T>(lhs) -= rhs
  • 7-9) std::complex<T>(lhs) *= rhs
  • 10-12) std::complex<T>(lhs) /= rhs

참고 (Notes)

템플릿 인자 추론은 암시적 변환을 고려하지 않기 때문에 이 연산자들은 정수/복소수 혼합 산술에 사용할 수 없어요. 모든 경우에 스칼라는 복소수의 기본 타입과 같은 타입이어야 해요.

GCC 플래그 -fcx-limited-range(-ffast-math에 포함)는 부동소수점 경계 조건 검사를 제거해 복소수 곱셈/나눗셈의 동작을 바꿔요. 이는 루프 벡터화에도 영향을 줘요.

예제 (Example)

이 코드를 실행해 봐요.

#include <complex>
#include <iostream>

int main()
{
    std::complex<double> c2(2.0, 0.0);
    std::complex<double> ci(0.0, 1.0);

    std::cout << ci << " + " << c2 << " = " << ci + c2 << '\n'
              << ci << " * " << ci << " = " << ci * ci << '\n'
              << ci << " + " << c2 << " / " << ci << " = " << ci + c2 / ci << '\n'
              << 1  << " / " << ci << " = " << 1.0 / ci << '\n';

//    std::cout << 1.0f / ci; // compile error
//    std::cout << 1 / ci; // compile error
}

출력:

(0,1) + (2,0) = (2,1)
(0,1) * (0,1) = (-1,0)
(0,1) + (2,0) / (0,1) = (0,-1)
1 / (0,1) = (0,-1)

더 알아보기 (Learn more)

cppreference