NAME

Math::Complex_C - perl interface to C's complex.h functions.

DEPENDENCIES

In order to compile this module, a C compiler that provides
complex.h is needed.

DESCRIPTION This module wraps the 'double _Complex' type (as a Math::Complex_C object) and the 'long double _Complex' type (as a Math::Complex_C::Long object).

use warnings;
use strict;
use Math::Complex_C qw(:all);
my $c =    Math::Complex_C->new(12.5, 1125); # 'double _Complex' type
my $root = Math::Complex_C->new();
my $cl = Math::Complex_C::Long->new(5.9,1.1); # 'long double _Complex'
my $rootl = Math::Complex_C::Long->new();
sqrt_c($root, $c);
sqrt_cl($rootl, $cl);
print "Square root of $c is $root\n";
print "Square root of $c1 is $rootl\n";

On many perls, the values printed out by the above code will be
identical - see the README for some elaboration.

Note that Math::Complex_C and Math::Complex_C::Long objects use
different functions (sqrt_c vs sqrt_cl, in the above example).

See also the Math::Complex_C test suite for some (simplistic) examples
of usage.

FUNCTIONS

$rop = Math::Complex_C->new([$re, [$im]]);
$rop = Math::Complex_C::new([$re, [$im]]);
$rop = new Math::Complex_C([$re, [$im]]);
$ropl = Math::Complex_C::Long->new([$re, [$im]]);
$ropl = Math::Complex_C::Long::new([$re, [$im]]);
$ropl = new Math::Complex_C::Long([$re, [$im]]);
 $rop/$ropl is a Math::Complex_C/Math::Complex_C::Long object;
 $re and $im are the real and imaginary values (respectively) that $rop
 holds. They can be an integer (signed or unsigned) or a floating point
 value.Integer values (IV/UV) will be converted to floating point (NV)
 before being assigned.
 Note that the two arguments ($re $im) are optional - ie can be omitted.
 If no arguments are supplied to new, then $rop will be assigned NaN for
 both the real and imaginary parts.
 If only one argument is supplied, then $rop will be assigned that value
 for the real part, and 0 for the imaginary part.
 
$rop = create_c();
$ropl = create_cl();
 $rop/$ropl is a Math::Complex_C/Math::Complex_C::Long object (created
 with both real and imaginary values set to NaN).

assign_c($rop, $re, $im);
assign_cl($ropl, $re, $im); 
 The real part of $rop/$ropl is set to the value of $re, the imaginary
 part is set to the value of $im.
 $re and $im can be an integer (signed or unsigned) or a floating point
 value. Integer values (IV/UV) will be converted to floating point (NV)
 before being assigned.

mul_c($rop, $op1, $op2);
mul_c_iv($rop, $op1, $si);
mul_c_uv($rop, $op1, $ui);
mul_c_nv($rop, $op1, $nv);
mul_cl($ropl, $op1, $op2);
mul_c_ivl($ropl, $op1, $si);
mul_c_uvl($ropl, $op1, $ui);
mul_c_nvl($ropl, $op1, $nv);
 Multiply $op1 by the 3rd arg, and store the result in $rop/$ropl.
 The "3rd arg" is (respectively, from the top) a Math::Complex_C object,
 a signed integer value (IV), an unsigned integer value (UV), and a
 floating point value (NV).

add_c($rop, $op1, $op2);
add_c_iv($rop, $op1, $si);
add_c_uv($rop, $op1, $ui);
add_c_nv($rop, $op1, $nv);
add_cl($ropl, $op1, $op2);
add_c_ivl($ropl, $op1, $si);
add_c_uvl($ropl, $op1, $ui);
add_c_nvl($ropl, $op1, $nv);
 As for mul_c(), etc., but performs addition.

div_c($rop, $op1, $op2);
div_c_iv($rop, $op1, $si);
div_c_uv($rop, $op1, $ui);
div_c_nv($rop, $op1, $nv);
div_cl($ropl, $op1, $op2);
div_c_ivl($ropl, $op1, $si);
div_c_uvl($ropl, $op1, $ui);
div_c_nvl($ropl, $op1, $nv);
 As for mul_c(), etc., but performs division.

sub_c($rop, $op1, $op2);
sub_c_iv($rop, $op1, $si);
sub_c_uv($rop, $op1, $ui);
sub_c_nv($rop, $op1, $nv);
sub_cl($ropl, $op1, $op2);
sub_c_ivl($ropl, $op1, $si);
sub_c_uvl($ropl, $op1, $ui);
sub_c_nvl($ropl, $op1, $nv);
 As for mul_c(), etc., but performs subtraction.

$nv = real_c($op);
$nv = real_cl($op);
 Returns the (floating point) value of the real component of $op.
 Wraps C's 'creal/creall' function.

$nv = imag_c($op);
$nv = imag_cl($op);
 Returns the (floating point) value of the imaginary component of $op.
 Wraps C's 'cimag/cimagl' function.

$nv = arg_c($op);
$nv = arg_cl($op);
 Returns the (floating point) value of the argument of $op.
 Wraps C's 'carg/cargl' function.

$nv = abs_c($op);
$nv = abs_cl($op);
 Returns the (floating point) absolute value of $op.
 Wraps C's 'cabs/cabsl' function.

conj_c($rop, $op);
conj_cl($ropl, $op);
 Sets $rop/$ropl to the conjugate of $op.
 Wraps C's 'conj/conjl' function.

acos_c($rop, $op);
acos_cl($ropl, $op);
 Sets $rop/$ropl to acos($op).
 Wraps C's 'cacos/cacosl' function.

asin_c($rop, $op);
asin_cl($ropl, $op);
 Sets $rop/$ropl to asin($op).
 Wraps C's 'casin/casinl' function.

atan_c($rop, $op);
atan_cl($ropl, $op);
 Sets $rop/$ropl to atan($op).
 Wraps C's 'catan/catanl' function.

cos_c($rop, $op);
cos_cl($ropl, $op);
 Sets $rop/$ropl to cos($op).
 Wraps C's 'ccos/ccosl' function.

sin_c($rop, $op);
sin_cl($ropl, $op);
 Sets $rop/$ropl to sin($op).
 Wraps C's 'csin/csinl' function.

tan_c($rop, $op);
tan_cl($ropl, $op);
 Sets $rop/$ropl to tan($op).
 Wraps C's 'ctan/ctanl' function.

acosh_c($rop, $op);
acosh_cl($ropl, $op);
 Sets $rop/$ropl to acosh($op).
 Wraps C's 'cacosh/cacoshl' function.

asinh_c($rop, $op);
asinh_cl($ropl, $op);
 Sets $rop/$ropl to asinh($op).
 Wraps C's 'casinh/casinhl' function.

atanh_c($rop, $op);
atanh_cl($ropl, $op);
 Sets $rop/$ropl to atanh($op).
 Wraps C's 'catanh/catanhl' function.

cosh_c($rop, $op);
cosh_cl($ropl, $op);
 Sets $rop/$ropl to cosh($op).
 Wraps C's 'ccosh/ccoshl' function.

sinh_c($rop, $op);
sinh_cl($rop, $op);
 Sets $rop/$ropl to sinh($op).
 Wraps C's 'csinh/csinhl' function.

tanh_c($rop, $op);
tanh_cl($ropl, $op);
 Sets $rop/$ropl to tanh($op).
 Wraps C's 'ctanh/ctanhl' function.

exp_c($rop, $op);
exp_cl($rop1, $op);
 Sets $rop/$ropl to e ** $op.
 Wraps C's 'cexp/cexpl' function.

log_c($rop, $op);
log_cl($ropl, $op);
 Sets $rop/$ropl to log($op).
 Wraps C's 'clog/clogl' function.

pow_c($rop, $op1, $op2);
pow_cl($ropl, $op1, $op2);
 Sets $rop/$ropl to $op1 ** $op2.
 Wraps C's 'cpow/cpowl' function.

sqrt_c($rop, $op);
sqrt_cl($ropl, $op);
 Sets $rop/$ropl to sqrt($op).
 Wraps C's 'csqrt/csqrtl' function.

proj_c($rop, $op);
proj_cl($ropl, $op);
 Sets $rop/$ropl to a projection of $op onto the Riemann sphere.
 Wraps C's 'cproj/cprojl' function.

$rop = get_nan();
$ropl = get_nanl();
 Sets $rop/$ropl to NaN.

$rop = get_inf();
$ropl = get_infl();
 Sets $rop/$ropl to Inf.

$bool = is_nan($op);
$bool = is_nanl($op);
 Returns true if $op is a NaN - else returns false

$bool = is_inf($op);
$bool = is_infl($op);
 Returns true if $op is -Inf or +Inf - else returns false

$bool = is_neg_zero($nv);
 Returns true if $nv is -0. Else returns false - hence the function
 returns false (and warns) if $nv is not an NV (since only an NV 
 can be -0).
 Perl can't be relied upon to print the '-' sign if the NV is -0.
 For example, 5.12.0 *will* print it, but 5.14.0 won't.
 Therefore, if we care about the sign, we need to check using this
 XSub.

OPERATOR OVERLOADING

Both Math::Complex_C and Math::Complex_C::Long overload the
following operators:
 *, +, /, -, **,
 *=, +=, /=, -=, **=,
 !, bool,
 ==, !=,
 =, "",
 abs, exp, log, cos, sin, atan2, sqrt

 Cross-class overloading is not impllemented - that is, you
 cannot use both a Math::Complex_C::Long object and a 
 Math::Complex_C object in the same overloaded operation.

 Note: For the purposes of the overloaded 'not', '!' and 'bool'
 operators, a "false" Math::Complex_C object is one with real 
 and imaginary parts that are both "false" - where "false"
 currently means either 0 (including -0) or NaN.
 (A "true" Math::Complex_C object is, of course, simply one
 that is not "false".)

 If the value passed to the overloaded '**', '**=' or
 'equivalence' operators is an IV/UV (integer), it will be
 converted to an NV (floating point value) before the calculation
 is performed.

LICENSE

This program is free software; you may redistribute it and/or 
modify it under the same terms as Perl itself.
Copyright 2011 Sisyphus.

AUTHOR

Sisyphus <sisyphus at(@) cpan dot (.) org>