20.1 °³¿ä

complex Ŭ·¡½º´Â ÅÛÇø´ Ŭ·¡½ºÀÌ´Ù. º¹¼Ò¼ö¿Í º¹¼Ò¼ö ¿¬»êµéÀÌ ÇÊ¿äÇÒ ¶§ »ç¿ëÇÏ¸é µÈ´Ù. complex Ŭ·¡½º´Â C++À» ´Ù·ç´Â Ã¥µé¿¡¼­ Ŭ·¡½º¸¦ Á¤ÀÇÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÒ ¶§ ÀÚÁÖ ¾²ÀÌ´Â ¿¹Á¦¶ó¼­, C++À» °øºÎÇϼ̴ø ºÐµéÀ̶ó¸é ÇѹøÂë Á¤ÀÇÇغÃÀ» Ŭ·¡½ºÀÏ °ÍÀÌ´Ù. C++ Ç¥ÁØ¿¡ Æ÷ÇÔµÈ complex Ŭ·¡½º´Â ÅÛÇø´À¸·Î Á¤ÀǵǾî ÀÖ°í, º¹¼Ò¼ö¿¡ Á¤ÀǵǾî ÀÖ´Â ¿¬»êµéÀÌ C++¿¡¼­ Á¦°øÇÏ´Â ¼öÄ¡ °ü·Ã ŸÀÔµé(int, float, double, long double, ...)°ú »ç¿ëÇϴµ¥ ¾Æ¹«·± Á¦¾àÀÌ ¾øµµ·Ï ¸¸µé¾îÁ® ÀÖ´Ù.

20.1.1 Include È­ÀÏ

º¹¼Ò¼ö¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥Àº complex Çì´õÈ­ÀÏÀ» Æ÷ÇÔ½ÃÄÑ¾ß ÇÑ´Ù.

   #include <complex>

 

20.2 º¹¼Ò¼öÀÇ »ý¼º°ú ±× »ç¿ë¹ý

¿©±â¼­´Â º¹¼Ò¼ö¸¦ »ý¼ºÇÏ´Â ¹æ¹ý°ú º¹¼Ò¼öµé°£ÀÇ ¿¬»ê¿¡ °üÇØ ¼³¸íÇϱâ·Î ÇÑ´Ù.

20.2.1 º¹¼Ò¼öÀÇ ¼±¾ð, ±ØÇü½Ä, º¸¼ö ±¸Çϱâ

complex ŸÀÔÀÇ °´Ã¼¸¦ ¼±¾ðÇϱâ À§Çؼ­´Â ¸ÕÀú º¹¼Ò¼öÀÇ ½Ç¼öºÎ¿Í Çã¼öºÎÀÇ Å¸ÀÔÀ» ¹«¾ùÀ¸·Î ÇÒÁö¸¦ °áÁ¤ÇØ¾ß ÇÑ´Ù. º¹¼Ò¼öÀÇ ½Ç¼öºÎ¿Í Çã¼öºÎÀÇ Å¸ÀÔÀº ÅÛÇø´ ÀÎÀÚ·Î ³Ñ°ÜÁÖ¸ç, À̶§, ÀÎÀÚÀÇ Å¸ÀÔÀº C++¿¡¼­ Á¦°øÇÏ´Â ºÎµ¿¼Ò¼ö µ¥ÀÌÅÍ Å¸ÀÔ¸¸ÀÌ Çã¿ëµÈ´Ù. Áï, float, double, long double ¼¼°¡Áö¸¸ °¡´ÉÇÏ´Ù´Â °ÍÀÌ´Ù.

complex Ŭ·¡½º´Â ³×°¡Áö ÇüÅÂÀÇ »ý¼ºÀÚ¸¦ °¡Áö°í ÀÖ´Ù. 1)ÀÎÀÚ°¡ ÁÖ¾îÁöÁö ¾ÊÀ¸¸é, ½Ç¼öºÎ¿Í Çã¼öºÎ°¡ ¸ðµÎ 0ÀÎ º¹¼Ò¼ö¸¦ »ý¼ºÇÏ°í, 2)ÀÎÀÚ°¡ Çϳª¸¸ ÁÖ¾îÁö¸é, ÀÌ´Â ½Ç¼öºÎÀÇ °ªÀ¸·Î ÇÒ´çµÇ¸ç, Çã¼öºÎ´Â 0ÀÎ º¹¼Ò¼ö¸¦ »ý¼ºÇÑ´Ù. 3)ÀÎÀÚ°¡ µÎ°³ÀÎ °æ¿ì¿¡´Â ½Ç¼öºÎ°¡ ù¹ø° ÀÎÀÚÀÇ °ªÀ» Çã¼öºÎ°¡ µÎ¹ø° ÀÎÀÚÀÇ °ªÀ» °¡Áö´Â º¹¼Ò¼ö¸¦ »ý¼ºÇÑ´Ù. 4)¸¶Áö¸·Àº º¹»ç »ý¼ºÀڷμ­, ´Ù¸¥ º¹¼Ò¼ö¸¦ ÀÎÀÚ·Î ¹Þ¾Æ ½Ç¼öºÎ¿Í Çã¼öºÎ°¡ µ¿ÀÏÇÑ º¹¼Ò¼ö¸¦ »ý¼ºÇس½´Ù.

   complex<double> com1;               // 0 + 0i
   complex<double> com2(3.14);         // 3.14 + 0i
   complex<double> com3(1.5, 3.14);    // 1.5 + 3.14i
   complex<double> com4(com2);         // 3.14 + 0i (com2¿Í µ¿ÀÏ)

´ç¿¬ÇÑ ¸»ÀÌÁö¸¸, º¹¼Ò¼ö°£¿¡´Â ¼­·Î ´ëÀÔÀÌ °¡´ÉÇÏ´Ù. ±×¸®°í, º¹¼Ò¼ö ŸÀÔÀÇ º¯¼ö¿¡ ½Ç¼ö°ªÀ» ´ëÀÔÇÒ ¼ö Àִµ¥, ÀÌ ¶§ ½Ç¼öºÎ´Â ¿ìº¯ÀÇ °ªÀ» °¡Áö°Ô µÇ°í, Çã¼öºÎ´Â 0 °ªÀ» °¡Áö°Ô µÈ´Ù. º¹¼Ò¼ö º¯¼ö¿¡ ½Ç¼ö°ªÀ» ´ëÀÔÇÒ ¶§´Â ½Ç¼ö¸¦ º¹¼Ò¼ö·Î ¹Ù²ãÁÖ´Â º¯È¯ »ý¼ºÀÚ(conversion constructor)°¡ ÇÊ¿äÇÏ°Ô µÇ´Âµ¥, ÀÌ ¶§ ¾Õ¿¡¼­ ¼³¸íÇÑ ÀÎÀÚ°¡ ÇϳªÀÎ »ý¼ºÀÚ¸¦ »ç¿ëÇÑ´Ù.

   com1 = com3;                        // com1: 1.5 + 3.14i
   com3 = 2.17;                        // com3: 2.17 + 0i

polar() ÇÔ¼ö´Â ±ØÇü½Ä(Å©±â¿Í À§»ó°¢À¸·Î Ç¥Çö)¿¡ ÇØ´çÇÏ´Â º¹¼Ò¼ö°ªÀ» ¾Ë¾Æ³»´Âµ¥ »ç¿ëÇÑ´Ù.

   com4 = polar(5.6, 1.8);             // 5.6 * ( cos(1.8) + sin(1.8) i)

conj()´Â ÀÎÀÚ·Î ÁÖ¾îÁø º¹¼Ò¼öÀÇ º¸¼ö¸¦ ±¸ÇÒ ¶§ »ç¿ëÇÑ´Ù. ÁÖ¾îÁø º¹¼Ò¼ö°¡ x+yi¶ó¸é, ÀÌ°ÍÀÇ º¸¼ö´Â x-yi°¡ µÈ´Ù.

   complex<double> com5 = conj(com3);  // com5: 1.5 - 3.14i
¢º ÇÔ¼ö¿Í ¸â¹ö ÇÔ¼ö
º¹¼Ò¼ö¿¡ °ü·ÃµÈ ¿¬»êµéÀº real()°ú imag()¸¦ Á¦¿ÜÇϸé(À̵éÀº ¸â¹öÇÔ¼ö), ³ª¸ÓÁö´Â ¸ðµÎ ¸â¹öÇÔ¼ö°¡ ¾Æ´Ñ ÀÏ¹Ý ÇÔ¼ö¸¦ ÅëÇØ ¼öÇàµÈ´Ù.

20.2.2 º¹¼Ò¼öÀÇ ½Ç¼öºÎ¿Í Çã¼öºÎ

¸â¹öÇÔ¼ö·Î Á¦°øµÇ´Â real()¿Í imag()´Â °¢°¢ º¹¼Ò¼öÀÇ ½Ç¼öºÎ¿Í Çã¼öºÎ¸¦ ¹ÝȯÇÑ´Ù. À̵éÀº ¸â¹öÇÔ¼ö»Ó¸¸ ¾Æ´Ï¶ó, ÀÏ¹Ý ÇÔ¼öÀÇ ÇüÅ·ΠȣÃâÇÒ ¼öµµ ÀÖ´Ù. ´ÙÀ½ µÎ ÁÙÀº ¿ÏÀüÈ÷ ¶È°°Àº °á°ú¸¦ Ãâ·ÂÇÑ´Ù.

   cout << com1.real() << "+" << com1.imag() << "i" << endl;
   cout << real(com1) << "+" << imag(com1) << "i" << endl;

20.2.3 º¹¼Ò¼öÀÇ »çÄ¢¿¬»ê

+, -, *, / ¿¬»êÀÚµéÀº °¢°¢ º¹¼Ò¼öÀÇ µ¡¼À, »¬¼À, °ö¼À, ³ª´°¼ÀÀ» ¼öÇàÇϴµ¥ »ç¿ëÇÑ´Ù. ÀÌµé ¿¬»êÀÚ´Â µÎ º¹¼Ò¼ö°£ÀÇ »çÄ¢¿¬»êÀ» ¼öÇàÇϸç, ¹°·Ð º¹¼Ò¼ö¿Í ½Ç¼ö°£ÀÇ »çÄ¢¿¬»ê¿¡µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. +=, -=, *=, /= ¿¬»êÀÚµµ Á¤ÀǵǾî ÀÖ´Ù.

   cout << com1 + com2 << endl;
   cout << com1 - 3.14 << endl;
   cout << 2.75 * com2 << endl;
   com1 += com3 / 2.0;

´ÜÇ× ¿¬»êÀÚ +¿Í -µµ Á¤ÀǵǾî ÀÖ´Ù. ´ÜÇ׿¬»êÀÚ -´Â ½Ç¼öºÎ¿Í Çã¼öºÎÀÇ ºÎÈ£¸¦ ¹Ù²ãÁØ´Ù.

20.2.4 º¹¼Ò¼öÀÇ ºñ±³

== ¿¬»êÀÚ¿Í != ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© º¹¼Ò¼ö°£ÀÇ »óµî°ü°è¸¦ ¾Ë¾Æº¼ ¼ö ÀÖ´Ù. µÎ º¹¼Ò¼öÀÇ »óµî°ü°è´Â ½Ç¼öºÎ¿Í Çã¼öºÎ°¡ ¸ðµÎ °°À» ¶§ ¼º¸³ÇÑ´Ù. ´Ü º¹¼Ò¼öÀÇ ºñ±³½Ã¿¡ ¹Ýµå½Ã À¯ÀÇÇÒ Á¡ÀÌ ÇÑ°¡Áö Àִµ¥, ÀÌ´Â º¹¼Ò¼ö°£¿¡´Â ´ë¼Ò °ü°è°¡ Á¤ÀǵǾî ÀÖÁö ¾Ê´Ù´Â °ÍÀÌ´Ù. µû¶ó¼­, º¹¼Ò¼ö°£¿¡´Â <, >, <=, >=¿Í °°Àº ºñ±³ ¿¬»êÀÚ¸¦ Àû¿ëÇÒ ¼ö ¾ø´Ù.

20.2.5 ½ºÆ®¸² ÀÔÃâ·Â

º¹¼Ò¼ö´Â ÀÔÃâ·Â ½ºÆ®¸²À» ÀÌ¿ëÇÑ Àбâ, ¾²±â°¡ °¡´ÉÇÏ´Ù. ½±°Ô ¸»ÇØ, '<<'¿¬»êÀÚ¿Í '>>' ¿¬»êÀÚ¸¦ ÀÌ¿ëÇÏ¿© º¹¼Ò¼öÀÇ Ãâ·Â°ú ÀÔ·ÂÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. º¹¼Ò¼ö¸¦ Ãâ·ÂÇÒ ¶§´Â ¾çÂÊ¿¡ °ýÈ£¸¦ ¾º¿ö¼­ Ãâ·ÂÇϴµ¥, ¿¹¸¦ µé¾î, º¹¼Ò¼ö '3+4i'´Â (3,4)¿Í °°ÀÌ Ãâ·ÂµÇ¸ç, '3'°ú °°ÀÌ Çã¼öºÎ°¡ 0ÀÎ º¹¼Ò¼öÀÇ °æ¿ì¿¡´Â (3)À¸·Î Ãâ·ÂµÈ´Ù.

20.2.6 º¹¼Ò¼öÀÇ ³ð(norm), Àý´ë°ª, À§»ó°¢ - norm(), abs(), arg()

norm() ÇÔ¼ö´Â º¹¼Ò¼öÀÇ ³ð(norm)°ªÀ» ¹ÝȯÇÑ´Ù. ³ð(norm)À̶õ ½Ç¼öºÎ¿Í Çã¼öºÎÀÇ Á¦°öÀÇ ÇÕÀÌ´Ù. abs() ÇÔ¼ö´Â º¹¼Ò¼öÀÇ Àý´ë°ªÀ» ¹ÝȯÇϸç, ³ð(norm)ÀÇ Á¦°ö±Ù¿¡ ÇØ´çÇÑ´Ù. ÀÌ µÎ ÇÔ¼ö´Â ¸ðµÎ ¸â¹öÇÔ¼ö°¡ ¾Æ´Ñ, º¹¼Ò¼ö¸¦ ÀÎÀÚ·Î °¡Áö´Â ÀÏ¹Ý ÇÔ¼öÀÌ´Ù.

   cout << norm(com2) << endl;
   cout << abs(com2) << endl;

º¹¼Ò¼öÀÇ À¯Çâ À§»ó°¢Àº arg()¸¦ »ç¿ëÇÏ¿© ¾ò¾î³¾ ¼ö ÀÖ´Ù.

   cout << com4 << " in polar coordinates is "
      << arg(com4) << " and " << norm(com4) << endl;

20.2.7 »ï°¢ÇÔ¼ö

±âÁ¸¿¡ ½Ç¼öÇü ŸÀÔ¿¡ ´ëÇØ Á¤ÀǵǾîÀÖ´ø »ï°¢ÇÔ¼öµé(sin(), cos(), tan(), sinh(), cosh(), tanh())Àº º¹¼Ò¼ö¸¦ ÀÎÀÚ·Î ¹Þ¾ÆµéÀÏ ¼ö ÀÖµµ·Ï È®ÀåµÇ¾ú´Ù. ÀÌµé °¢°¢Àº º¹¼Ò¼ö¸¦ ÀÎÀÚ·Î ¹Þ¾Æ º¹¼Ò¼ö°ªÀ» ¹ÝȯÇÑ´Ù.

20.2.8 ÃÊ¿ùÇÔ¼ö

ÃÊ¿ùÇÔ¼ö(exp(), log(), log10(), sqrt())µéµµ º¹¼Ò¼ö¸¦ ÀÎÀÚ·Î ¹ÞÀ» ¼ö ÀÖ°Ô È®ÀåµÇ¾ú´Ù. º¹¼Ò¼ö¸¦ ÀÎÀÚ·Î ¹Þ¾Æ º¹¼Ò¼ö¸¦ ¹ÝȯÇÑ´Ù.

Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­´Â ¿©·¯°¡Áö ÇüÅÂÀÇ Áö¼öÇÔ¼ö pow()¸¦ Á¤ÀÇÇÏ°í Àִµ¥, ¹ØÀÌ º¹¼Ò¼öÀÌ°í Áö¼ö°¡ Á¤¼ö/º¹¼Ò¼ö/½Ç¼öÀÎ °Í, ¹ØÀÌ ½Ç¼öÀÌ°í Áö¼ö°¡ º¹¼Ò¼öÀÎ °ÍµéÀÌ ÀÖ´Ù.
 

20.3 ¿¹Á¦ ÇÁ·Î±×·¥ - ÀÌÂ÷¹æÁ¤½ÄÀÇ ±Ù

ÀÌÂ÷¹æÁ¤½Ä ax2 + bx + c = 0 ÀÇ ±ÙÀº ´ÙÀ½ °ø½ÄÀ¸·Î ±¸ÇÒ ¼ö ÀÖ´Ù.

   x = (-b + sqrt(b2 - 4ac)) / 2a
     ¶Ç´Â
   x = (-b - sqrt(b2 - 4ac)) / 2a

´ÙÀ½ ÇÔ¼ö´Â ÀÌÂ÷¹æÁ¤½ÄÀ» ±¸¼ºÇÏ´Â °¢Ç×ÀÇ °è¼ö¸¦ ÀÎÀÚ·Î ¹Þ¾Æ µÎ±ÙÀ» ±¸ÇÑ µÚ, À̵éÀ» pair °´Ã¼¿¡ ´ã¾Æ ¹ÝȯÇÑ´Ù.

   typedef complex<double> dcomplex;

   pair<dcomplex, dcomplex> quadratic(dcomplex a, dcomplex b, dcomplex c)
   {
      dcomplex root = sqrt(b * b - 4.0 * a * c);
      a *= 2.0;
      return make_pair((-b + root) / a, (-b - root) / a);
   }