% 超简单的复数的Erlang实现
% 参见: http://www.trapexit.org/Complex_Numbers
-module(complex).
-export([make/2, is_complex/1, add/2, sub/2, mult/2, divide/2,
get_real/1, get_imaginary/1]).
-record( complex, {real, imaginary}).
is_complex(X) when is_record(X, complex) -> true;
is_complex(_) -> false.
make(Real, Imaginary) ->
#complex{real = Real, imaginary = Imaginary}.
make(X) when is_record(X, complex) -> X;
make(Real) -> make(Real, 0).
add(X, Y) ->
A = make(X), B = make(Y),
make( A#complex.real + B#complex.real,
A#complex.imaginary + B#complex.imaginary).
sub(X, Y) ->
A = make(X), B = make(Y),
make( A#complex.real - A#complex.real,
B#complex.imaginary - B#complex.imaginary).
mult(X, Y) ->
A = make(X), B = make(Y),
make( (A#complex.real * B#complex.real)
- (A#complex.imaginary * B#complex.imaginary),
(A#complex.real * B#complex.imaginary)
+ (B#complex.real * A#complex.imaginary) ).
divide(X,Y) ->
A = make(X), B = make(Y),
Divisor = math:pow(B#complex.real,2) + math:pow(B#complex.imaginary,2),
make( ((A#complex.real * B#complex.real)
+ (A#complex.imaginary * B#complex.imaginary)) / Divisor,
((A#complex.imaginary * B#complex.real)
- (A#complex.real * B#complex.imaginary)) / Divisor).
get_real(X) -> X#complex.real.
get_imaginary(X) -> X#complex.imaginary.