Your application must manipulate complex numbers, as are often needed in engineering, science, and mathematics.
Either keep track of the real and imaginary components yourself, or use the Math::Complex class (part of the standard Perl distribution).
# $c = $a * $b manually $c_real = ( $a_real * $b_real ) - ( $a_imaginary * $b_imaginary ); $c_imaginary = ( $a_real * $b_imaginary ) + ( $b_real * $a_imaginary );
# $c = $a * $b using Math::Complex use Math::Complex; $c = $a * $b;
Here's how you'd manually multiply 3+5i
and 2-2i
:
$a_real = 3; $a_imaginary = 5; # 3 + 5i;
$b_real = 2; $b_imaginary = -2; # 2 - 2i;
$c_real = ( $a_real * $b_real ) - ( $a_imaginary * $b_imaginary );
$c_imaginary = ( $a_real * $b_imaginary ) + ( $b_real * $a_imaginary );
print "c = ${c_real}+${c_imaginary}i\n";
c = 16+4i
and with Math::Complex:
use Math::Complex;
$a = Math::Complex->new(3,5); # or Math::Complex->new(3,5);
$b = Math::Complex->new(2,-2);
$c = $a * $b;
print "c = $c\n";
c = 16+4i
With the 5.004 version, you may create complex numbers via the cplx
constructor or via the exported constant i :
use Math::Complex;
$c = cplx(3,5) * cplx(2,-2); # easier on the eye
$d = 3 + 4*i; # 3 + 4i
printf "sqrt($d) = %s\n", sqrt($d);
sqrt(3+4i) = 2+i
The original Math::Complex module distributed with 5.003 did not overload as many functions and operators as the 5.004 version does. Also, the Math::Trig module (new as of 5.004) uses the Math::Complex module internally because some functions can break out from the real axis into the complex plane - for example, the inverse sine of 2.
The documentation for the standard Math::Complex module (also in Chapter 7 of Programming Perl)