Difference between revisions of "cpp/numeric/complex/operator arith3"
m (Use new list syntax) |
m (fmt) |
||
(9 intermediate revisions by 6 users not shown) | |||
Line 1: | Line 1: | ||
− | {{ | + | {{title|operator+,-{{small|()}}}} |
{{cpp/numeric/complex/navbar}} | {{cpp/numeric/complex/navbar}} | ||
− | {{ | + | {{begin}} |
− | {{ | + | {{|num=1|= |
template< class T > | template< class T > | ||
− | complex<T> operator+( const complex<T>& lhs, const complex<T>& rhs); | + | complex<T> operator+( const complex<T>& lhs, |
+ | const | ||
+ | |||
+ | |||
+ | |||
+ | complex<T>& rhs ); | ||
}} | }} | ||
− | {{ | + | {{|num=2|= |
template< class T > | template< class T > | ||
− | complex<T> operator+( const complex<T>& lhs, const T& rhs); | + | complex<T> operator+( const complex<T>& lhs, |
+ | |||
+ | |||
+ | |||
+ | |||
+ | const T& rhs ); | ||
}} | }} | ||
− | {{ | + | {{|num=3| |
+ | |||
+ | |||
+ | |||
+ | = | ||
template< class T > | template< class T > | ||
− | complex<T> operator+( const T& lhs, const complex<T>& rhs); | + | complex<T> operator+( const T& lhs, |
+ | const complex<T>& rhs ); | ||
}} | }} | ||
− | {{ | + | {{|num=4|= |
template< class T > | template< class T > | ||
− | complex<T> operator-( const complex<T>& lhs, const complex<T>& rhs); | + | complex<T> operator-( const complex<T>& lhs, |
+ | const | ||
+ | |||
+ | |||
+ | |||
+ | complex<T>& rhs ); | ||
}} | }} | ||
− | {{ | + | {{|num=5|= |
template< class T > | template< class T > | ||
− | complex<T> operator-( const complex<T>& lhs, const T& rhs); | + | complex<T> operator-( const complex<T>& lhs, |
+ | |||
+ | |||
+ | |||
+ | |||
+ | const T& rhs ); | ||
}} | }} | ||
− | {{ | + | {{|num=6| |
+ | |||
+ | |||
+ | |||
+ | = | ||
template< class T > | template< class T > | ||
− | complex<T> operator-( const T& lhs, const complex<T>& rhs); | + | complex<T> operator-( const T& lhs, |
+ | const complex<T>& rhs ); | ||
}} | }} | ||
− | {{ | + | {{|num=7|= |
template< class T > | template< class T > | ||
− | complex<T> operator*( const complex<T>& lhs, const complex<T>& rhs); | + | complex<T> operator*( const complex<T>& lhs, |
+ | const | ||
+ | |||
+ | |||
+ | |||
+ | complex<T>& rhs ); | ||
}} | }} | ||
− | {{ | + | {{|num=8|= |
template< class T > | template< class T > | ||
− | complex<T> operator*( const complex<T>& lhs, const T& rhs); | + | complex<T> operator*( const complex<T>& lhs, |
+ | |||
+ | |||
+ | |||
+ | |||
+ | const T& rhs ); | ||
}} | }} | ||
− | {{ | + | {{|num=9| |
+ | |||
+ | |||
+ | |||
+ | = | ||
template< class T > | template< class T > | ||
− | complex<T> operator*( const T& lhs, const complex<T>& rhs); | + | complex<T> operator*( const T& lhs, |
+ | const complex<T>& rhs ); | ||
}} | }} | ||
− | {{ | + | {{|num=10|= |
template< class T > | template< class T > | ||
− | complex<T> operator/( const complex<T>& lhs, const complex<T>& rhs); | + | complex<T> operator/( const complex<T>& lhs, |
+ | const | ||
+ | |||
+ | |||
+ | |||
+ | complex<T>& rhs ); | ||
}} | }} | ||
− | {{ | + | {{|num=11|= |
template< class T > | template< class T > | ||
− | complex<T> operator/( const complex<T>& lhs, const T& rhs); | + | complex<T> operator/( const complex<T>& lhs, |
+ | |||
+ | |||
+ | |||
+ | |||
+ | const T& rhs ); | ||
}} | }} | ||
− | {{ | + | {{|num=12| |
+ | |||
+ | |||
+ | |||
+ | = | ||
template< class T > | template< class T > | ||
− | complex<T> operator/( const T& lhs, const complex<T>& rhs); | + | complex<T> operator/( const T& lhs, |
+ | const complex<T>& rhs ); | ||
}} | }} | ||
− | {{ | + | {{end}} |
Implements the binary operators for complex arithmetic and for mixed complex/scalar arithmetic. Scalar arguments are treated as complex numbers with the real part equal to the argument and the imaginary part set to zero. | Implements the binary operators for complex arithmetic and for mixed complex/scalar arithmetic. Scalar arguments are treated as complex numbers with the real part equal to the argument and the imaginary part set to zero. | ||
− | @1-3@ Returns the sum of its arguments | + | @1-3@ Returns the sum of its arguments |
− | @4-6@ Returns the result of subtracting {{ | + | @4-6@ Returns the result of subtracting {{|rhs}} from {{|lhs}} |
− | @7-9@ Multiplies its arguments | + | @7-9@ Multiplies its arguments |
− | @10-12@ Divides {{ | + | @10-12@ Divides {{|lhs}} by {{|rhs}} |
===Parameters=== | ===Parameters=== | ||
− | {{ | + | {{begin}} |
− | {{ | + | {{|lhs, rhs|the arguments: either both complex numbers or one complex and one scalar of matching type ({{c|float}}, {{c|double}}, {{c|long double}})}} |
− | {{ | + | {{end}} |
===Return value=== | ===Return value=== | ||
− | @1-3@ {{c|1= complex<T>(lhs) += rhs }} | + | @1-3@ {{c|1= complex<T>(lhs) += rhs}} |
− | @4-6@ {{c|1= complex<T>(lhs) -= rhs }} | + | @4-6@ {{c|1= complex<T>(lhs) -= rhs}} |
− | @7-9@ {{c|1= complex<T>(lhs) *= rhs }} | + | @7-9@ {{c|1= complex<T>(lhs) *= rhs}} |
− | @10-12@ {{c|1= complex<T>(lhs) /= rhs }} | + | @10-12@ {{c|1= complex<T>(lhs) /= rhs}} |
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
===Example=== | ===Example=== | ||
− | {{example | + | {{example |
− | + | |code= | |
− | + | ||
#include <complex> | #include <complex> | ||
+ | |||
+ | |||
int main() | int main() | ||
{ | { | ||
− | std::complex<double> c2(2, 0); | + | std::complex<double> c2(2, 0); |
− | std::complex<double> ci(0, 1); | + | std::complex<double> ci(0, 1); |
− | std::cout << ci << " + " << c2 << " = " << ci+c2 << '\n' | + | std::cout << ci << " + " << c2 << " = " << ci + c2 << '\n' |
− | << ci << " * " << ci << " = " << ci*ci << '\n' | + | << ci << " * " << ci << " = " << ci * ci << '\n' |
− | << ci << " + " << c2 << " / " << ci << " = " << ci+c2/ci << '\n' | + | << ci << " + " << c2 << " / " << ci << " = " << ci + c2 / ci << '\n' |
− | << 1 << " / " << ci << " = " << 1./ci << '\n'; | + | << 1 << " / " << ci << " = " << 1./ ci << '\n'; |
− | // std::cout << 1. | + | // std::cout << 1./ ci; // compile error |
− | // std::cout << 1/ci; // compile error | + | // std::cout << 1 / ci; // compile error |
} | } | ||
− | + | |output= | |
(0,1) + (2,0) = (2,1) | (0,1) + (2,0) = (2,1) | ||
(0,1) * (0,1) = (-1,0) | (0,1) * (0,1) = (-1,0) | ||
Line 96: | Line 162: | ||
===See also=== | ===See also=== | ||
− | {{ | + | {{begin}} |
− | {{ | + | {{|cpp/numeric/complex/operator_arith}} |
− | {{ | + | {{|cpp/numeric/complex/operator_arith2}} |
− | {{ | + | {{end |
+ | |||
+ | }} |
Latest revision as of 13:51, 2 July 2023
(1) | ||
template< class T > std::complex<T> operator+( const std::complex<T>& lhs, |
(until C++20) | |
template< class T > constexpr std::complex<T> operator+( const std::complex<T>& lhs, |
(since C++20) | |
(2) | ||
template< class T > std::complex<T> operator+( const std::complex<T>& lhs, |
(until C++20) | |
template< class T > constexpr std::complex<T> operator+( const std::complex<T>& lhs, |
(since C++20) | |
(3) | ||
template< class T > std::complex<T> operator+( const T& lhs, |
(until C++20) | |
template< class T > constexpr std::complex<T> operator+( const T& lhs, |
(since C++20) | |
(4) | ||
template< class T > std::complex<T> operator-( const std::complex<T>& lhs, |
(until C++20) | |
template< class T > constexpr std::complex<T> operator-( const std::complex<T>& lhs, |
(since C++20) | |
(5) | ||
template< class T > std::complex<T> operator-( const std::complex<T>& lhs, |
(until C++20) | |
template< class T > constexpr std::complex<T> operator-( const std::complex<T>& lhs, |
(since C++20) | |
(6) | ||
template< class T > std::complex<T> operator-( const T& lhs, |
(until C++20) | |
template< class T > constexpr std::complex<T> operator-( const T& lhs, |
(since C++20) | |
(7) | ||
template< class T > std::complex<T> operator*( const std::complex<T>& lhs, |
(until C++20) | |
template< class T > constexpr std::complex<T> operator*( const std::complex<T>& lhs, |
(since C++20) | |
(8) | ||
template< class T > std::complex<T> operator*( const std::complex<T>& lhs, |
(until C++20) | |
template< class T > constexpr std::complex<T> operator*( const std::complex<T>& lhs, |
(since C++20) | |
(9) | ||
template< class T > std::complex<T> operator*( const T& lhs, |
(until C++20) | |
template< class T > constexpr std::complex<T> operator*( const T& lhs, |
(since C++20) | |
(10) | ||
template< class T > std::complex<T> operator/( const std::complex<T>& lhs, |
(until C++20) | |
template< class T > constexpr std::complex<T> operator/( const std::complex<T>& lhs, |
(since C++20) | |
(11) | ||
template< class T > std::complex<T> operator/( const std::complex<T>& lhs, |
(until C++20) | |
template< class T > constexpr std::complex<T> operator/( const std::complex<T>& lhs, |
(since C++20) | |
(12) | ||
template< class T > std::complex<T> operator/( const T& lhs, |
(until C++20) | |
template< class T > constexpr std::complex<T> operator/( const T& lhs, |
(since C++20) | |
Implements the binary operators for complex arithmetic and for mixed complex/scalar arithmetic. Scalar arguments are treated as complex numbers with the real part equal to the argument and the imaginary part set to zero.
Contents |
[edit] Parameters
lhs, rhs | - | the arguments: either both complex numbers or one complex and one scalar of matching type (float, double, long double) |
[edit] Return value
[edit] Notes
Because template argument deduction does not consider implicit conversions, these operators cannot be used for mixed integer/complex arithmetic. In all cases, the scalar must have the same type as the underlying type of the complex number.
The GCC flag "-fcx-limited-range" (included by "-ffast-math") changes the behavior of complex multiply/division by removing checks for floating point edge cases. This impacts loop vectorization.
[edit] 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 }
Output:
(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)
[edit] See also
compound assignment of two complex numbers or a complex and a scalar (public member function) | |
applies unary operators to complex numbers (function template) |