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)