blob: af4fc3c22590ed70d7e6119b45890b267a17aca3 [file] [log] [blame]
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed
with this work for additional information regarding copyright
ownership. The ASF licenses this file to you under the Apache
License, Version 2.0 (the License); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. See the License for the specific language governing
permissions and limitations under the License.
Copyright 1999-2007 Rogue Wave Software, Inc.
-->
<HTML>
<HEAD>
<TITLE>Creating and Using Complex Numbers</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="20-1.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="20-3.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library User's Guide</B></DIV>
<H2>20.2 Creating and Using Complex Numbers</H2>
<P>In the following sections we describe the operations used to create and manipulate complex numbers.</P>
<A NAME="2021"><H3>20.2.1 Declaring Complex Numbers</H3></A>
<A NAME="idx434"><!></A>
<P>The template argument is used to define the types associated with the real and imaginary fields. This argument must be one of the floating point number datatypes available in the C++ language, either <SAMP>float</SAMP>, <SAMP>double</SAMP>, or <SAMP>long</SAMP> <SAMP>double</SAMP>.</P>
<P>There are several constructors associated with the class. A constructor with no arguments initializes both the real and imaginary fields to zero. A constructor with a single argument initializes the real field to the given value, and the imaginary value to zero. A constructor with two arguments initializes both real and imaginary fields. Finally, a copy constructor can be used to initialize a complex number with values derived from another complex number.</P>
<UL><PRE>
std::complex&lt;double&gt; com_one; // value 0 + 0i
std::complex&lt;double&gt; com_two(3.14); // value 3.14 + 0i
std::complex&lt;double&gt; com_three(1.5, 3.14) // value 1.5 + 3.14i
std::complex&lt;double&gt; com_four(com_two); // value is also 3.14 + 0i
</PRE></UL>
<P>A complex number can be assigned the value of another complex number. Since the one-argument constructor is also used for a conversion operator, a complex number can also be assigned the value of a real number. The real field is changed to the right-hand side, while the imaginary field is set to zero:</P>
<UL><PRE>
com_one = com_three; // becomes 1.5 + 3.14i
com_three = 2.17; // becomes 2.17 + 0i
</PRE></UL>
<A NAME="idx435"><!></A>
<P>The function <SAMP>polar()</SAMP> can be used to construct a complex number with the given magnitude and phase angle:</P>
<UL><PRE>
com_four = std::polar(5.6, 1.8);
</PRE></UL>
<A NAME="idx436"><!></A>
<P>The conjugate of a complex number is formed using the function <SAMP>conj()</SAMP>. If a complex number represents <SAMP>x + iy</SAMP>, then the conjugate is the value <SAMP>x-iy</SAMP>.</P>
<UL><PRE>
std::complex&lt;double&gt; com_five = std::conj(com_four);
</PRE></UL>
<A NAME="2022"><H3>20.2.2 Accessing Complex Number Values</H3></A>
<A NAME="idx437"><!></A>
<P>The member functions <SAMP>real()</SAMP> and <SAMP>imag()</SAMP> return the real and imaginary fields of a complex number, respectively. These functions can also be invoked as ordinary functions with complex number arguments.</P>
<UL><PRE>
// the following should be the same
std::cout &lt;&lt; com_one.real() &lt;&lt; "+" &lt;&lt; com_one.imag()
&lt;&lt; "i" &lt;&lt; std::endl;
std::cout &lt;&lt; std::real(com_one) &lt;&lt; "+" &lt;&lt; std::imag(com_one)
&lt;&lt; "i" &lt;&lt; std::endl;
</PRE></UL>
<BLOCKQUOTE><HR><B>
NOTE -- With the exception of the member functions real() and imag(), most operations on complex numbers are performed using ordinary functions, not member functions.
</B><HR></BLOCKQUOTE>
<A NAME="2023"><H3>20.2.3 Arithmetic Operations</H3></A>
<P>The arithmetic operators <SAMP>+</SAMP>,<SAMP> -</SAMP>,<SAMP> *</SAMP>, and <SAMP>/</SAMP> can be used to perform addition, subtraction, multiplication, and division of complex numbers. All four work either with two complex numbers, or with a complex number and a real value. Assignment operators are also defined for all four.</P>
<UL><PRE>
std::cout &lt;&lt; com_one + com_two &lt;&lt; std::endl;
std::cout &lt;&lt; com_one - 3.14 &lt;&lt; std::endl;
std::cout &lt;&lt; 2.75 * com_two &lt;&lt; std::endl;
com_one += com_three / 2.0;
</PRE></UL>
<P>The unary operators <SAMP>+</SAMP> and <SAMP>-</SAMP> can also be applied to complex numbers.</P>
<A NAME="2024"><H3>20.2.4 Comparing Complex Values</H3></A>
<A NAME="idx438"><!></A>
<P>Two complex numbers can be compared for equality or inequality, using <SAMP>operator==()</SAMP> and <SAMP>operator!=(). </SAMP>Two values are equal if their corresponding fields are equal. Complex numbers do not have a natural ordering, and thus cannot be compared using any other relational operator.</P>
<A NAME="2025"><H3>20.2.5 Stream Input and Output</H3></A>
<A NAME="idx439"><!></A>
<P>Complex numbers can be written to an output stream, or read from an input stream, using the normal stream I/O conventions. A value is written in parentheses, either as <SAMP>(u)</SAMP> or <SAMP>(u,v)</SAMP>, depending upon whether or not the imaginary value is zero. A value is read as a set of parentheses surrounding two numeric values.</P>
<A NAME="2026"><H3>20.2.6 Norm and Absolute Value</H3></A>
<A NAME="idx440"><!></A>
<P>The function <SAMP>std::norm()</SAMP> returns the norm of the complex number. This is the sum of the squares of the real and imaginary parts. The function <SAMP>std::abs()</SAMP> returns the absolute value, which is the square root of the norm. Note that both are ordinary functions that take the complex value as an argument, not member functions.</P>
<UL><PRE>
std::cout &lt;&lt; std::norm(com_two) &lt;&lt; std::endl;
std::cout &lt;&lt; std::abs(com_two) &lt;&lt; std::endl;
</PRE></UL>
<A NAME="idx441"><!></A>
<P>The directed phase angle of a complex number is yielded by the function <SAMP>std::arg()</SAMP>:</P>
<UL><PRE>
std::cout &lt;&lt; com_four &lt;&lt; " in polar coordinates is "
&lt;&lt; std::arg(com_four) &lt;&lt; " and " &lt;&lt; std::norm(com_four)
&lt;&lt; std::endl;
</PRE></UL>
<A NAME="2027"><H3>20.2.7 Trigonometric Functions</H3></A>
<A NAME="idx442"><!></A>
<P>The trigonometric functions defined for floating point values have all been extended to complex number arguments. These functions are <SAMP>std::sin()</SAMP>, <SAMP>std::cos()</SAMP>, <SAMP>std::tan()</SAMP>, <SAMP>std::sinh()</SAMP>, <SAMP>std::cosh()</SAMP>, and <SAMP>std::tanh()</SAMP>. Each takes a single complex number as argument and returns a complex number as result. </P>
<A NAME="2028"><H3>20.2.8 Transcendental Functions</H3></A>
<A NAME="idx443"><!></A>
<P>The transcendental functions<SAMP> std::exp()</SAMP>, <SAMP>std::log()</SAMP>, <SAMP>std::log10()</SAMP>, and <SAMP>std::sqrt()</SAMP> have been extended to complex arguments. Each takes a single complex number as argument, and returns a complex number as result.</P>
<A NAME="idx444"><!></A>
<P>The C++ Standard Library defines several variations of the exponential function <SAMP>std::pow()</SAMP>. Versions exist to raise a complex number to an integer power, to raise a complex number to a complex power or to a real power, or to raise a real value to a complex power.</P>
<BR>
<HR>
<A HREF="20-1.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="20-3.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A>
<!-- Google Analytics tracking code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-1775151-1";
urchinTracker();
</script>
<!-- end of Google Analytics tracking code -->
</BODY>
</HTML>