NAME

Math::Complex_C::Q - perl interface to C's __complex128 (quadmath) operations.

DEPENDENCIES

In order to compile this module, the quadmath library is needed.

DESCRIPTION

use warnings;
use strict;
use Math::Complex_C::Q qw(:all);
# For brevity, use MCQ which is an alias for Math::Complex_C::Q::new
my $c =    MCQ(12.5, 1125); # assign as NV
my $root = MCQ();

sqrt_cq($root, $c);
print "Square root of $c is $root\n";

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

This module is written largely for the use of perl builds whose nvtype is
'__float128'. Run "perl -V:nvtype" to see what your perl's NV type is. If
your nvtype is not '__float128' you can still use this module  and utilise
the extra precision it provides. See the "Which Math::Complex_C" section
of the README that ships with this module's source for a more detailed
explanation.
You can also install Math::Complex_C and/or Math::Complex_C::L if this
module won't build for you or you prefer to work with less precision.

A number of the functions below accept string arguments. These arguments
will be tested by the perl API function looks_like_number() for the
presence of non-numeric characters. If any such non-numeric characters
are detected, then the global non-numeric flag (which is initially set to
0) will be incremented. You can query the value this global flag holds by
running Math::Complex_C::Q::nnumflag() and you can manually alter the
value of the global using Math::Complex_C::Q::set_nnum and
Math::Complex_C::Q::clear_nnum. These functions are documented below.

FUNCTIONS

$rop = Math::Complex_C::Q->new($re, $im);
$rop = Math::Complex_C::Q::new($re, $im);
$rop = MCQ($re, $im); # MCQ is an alias to Math::Complex_C::Q::new()
 $rop is a returned Math::Complex_C::Q object; $re and $im are the real and
 imaginary values (respectively) that $rop holds. They (ie $re, $im) can be
 integer values (IV or UV), floating point values (NV), numeric strings
 or Math::Float128 objects.IV, UV and NV values will be cast to __float128
 values before being assigned. Strings (PV) will be assigned using C's
 strtoflt128() function.
 Note that the two arguments ($re & $im) are optional - ie they can be omitted.
 If no arguments are supplied, then $rop will be assigned NaN for both the real
 and imaginary parts.
 If only one argument is supplied, and that argument is a Math::Complex_C::Q
 object then $rop will be a duplicate of that Math::Complex_C::Q object.
 Otherwise the single argument will be assigned to the real part of $rop, and
 the imaginary part will be set to zero.
 The functions croak if an invalid arg is supplied.

$rop = create_cq();
 $rop is a Math::Complex_C::Q object, created with both real and imaginary
 values set to NaN. (Same result as calling new() without any args.)

assign_cq($rop, $re, $im);
 The real part of $rop is set to the value of $re, the imaginary part is set to
 the value of $im. $re and $im can be  integers (IV or UV),  floating point
 values (NV), numeric strings, or Math::Float128 objects .

set_real_cq($rop, $re);
 The real part of $rop is set to the value of $re. $re can be an integer (IV or
 UV),  floating point value (NV), numeric string, or Math::Float128 object.

set_imag_cq($rop, $im);
 The imaginary part of $rop is set to the value of $im. $im can be an integer
 (IV/UV),  floating point value (NV), numeric string, or Math::Float128 object.

F2cq($rop, $r_f, $i_f); #$r_f & $i_f are Math::Float128 objects
 Assign the real and imaginary part of $rop from the Math::Float128 objects $r_f
 and $i_f (respectively).

cq2F($r_f, $f_i, $op); #$r_f & $i_f are Math::Float128 objects
 Assign the real and imaginary parts of $op to the Math::Float128 objects $r_f
 and $i_f (respectively).

mul_cq   ($rop, $op1, $op2);
mul_cq_iv($rop, $op1, $si);
mul_cq_uv($rop, $op1, $ui);
mul_cq_nv($rop, $op1, $nv);
mul_cq_pv($rop, $op1, $pv);
 Multiply $op1 by the 3rd arg, and store the result in $rop.
 The "3rd arg" is (respectively, from top) a Math::Complex_C::Q object,
 a signed integer value (IV), an unsigned integer value (UV), a floating point
 value (NV), a numeric string (PV). The UV, IV, NV and PV values are real only -
 ie no imaginary component. The PV will be set to a __float128 value using C's
 strtoflt128() function. The UV, IV and NV values will be cast to __float128
 values.

add_cq   ($rop, $op1, $op2);
add_cq_iv($rop, $op1, $si);
add_cq_uv($rop, $op1, $ui);
add_cq_nv($rop, $op1, $nv);
add_cq_pv($rop, $op1, $pv);
 As for mul_cq(), etc., but performs addition.

div_cq   ($rop, $op1, $op2);
div_cq_iv($rop, $op1, $si);
div_cq_uv($rop, $op1, $ui);
div_cq_nv($rop, $op1, $nv);
div_cq_pv($rop, $op1, $pv);
 As for mul_cq(), etc., but performs division.

sub_cq   ($rop, $op1, $op2);
sub_cq_iv($rop, $op1, $si);
sub_cq_uv($rop, $op1, $ui);
sub_cq_nv($rop, $op1, $nv);
sub_cq_pv($rop, $op1, $pv);
 As for mul_cq(), etc., but performs subtraction.

$nv = real_cq($op);
 Returns the real part of $op as an NV. If your perl's NV is not __float128
 use either real_cq2F($op) or (q_to_str($op))[1].
 Wraps C's 'crealq' function.

$nv = imag_cq($op);
 Returns the imaginary part of $op as an NV. If your perl's NV is not
 __float128 use either real_cq2F($op) or (q_to_str($op))[1].
 Wraps C's 'cimagq' function.

$f = real_cq2F($op);
$f = imag_cq2F($op);
 Returns a Math::Float128 object $f set to the value of $op's real (and
 respectively, imag) component. No point in using this function unless
 Math::Float128 is loaded.
 Wraps 'crealq' and 'cimagq' to obtain the values.

$str = real_cq2str($op);
$str = imag_cq2str($op);
 Returns a string set to the value of $op's real (and respectively, imag)
 component.
 Wraps 'crealq' and 'cimagq' to obtain the values.

$nv = arg_cq($op);
 Returns the argument of $op as an NV.If your perl's NV is not
 __float128 use either arg_cq2F() or arg_cq2str().
 Wraps C's 'cargq' function.

$f = arg_cq2F($op);
 Returns the Math::Float128 object $f, set to the value of the argument
 of $op. No point in using this function unless Math::Float128 is loaded.
 Wraps C's 'cargq' function.

$str = arg_cq2str($op);
 Returns the string $str, set to the value of the argument of $op. No
 point in using this function unless Math::Float128 is loaded.
 Wraps C's 'cargq' function.

$nv = abs_cq($op);
 Returns the absolute value of $op as an NV.If your perl's NV is not
 __float128 use either arg_cq2F() or arg_cq2str().
 Wraps C's 'cabsq' function.

$f = abs_cq2F($op);
 Returns the Math::Float128 object $f, set to the absolute value of $op.
 No point in using this function unless Math::Float128 is loaded.
 Wraps C's 'cabsq' function.

$str = abs_cq2str($op);
 Returns the string $str, set to the absolute value of $op. No point
 in using this function unless Math::Float128 is loaded.
 Wraps C's 'cabsq' function.

conj_cq($rop, $op);
 Sets $rop to the conjugate of $op.
 Wraps C's 'conjq' function.

acos_cq($rop, $op);
 Sets $rop to acos($op). Wraps C's 'cacosq' function.

asin_cq($rop, $op);
 Sets $rop to asin($op). Wraps C's 'casinq' function.

atan_cq($rop, $op);
 Sets $rop to atan($op). Wraps C's 'catanq' function.

cos_cq($rop, $op);
 Sets $rop to cos($op). Wraps C's 'ccosq' function.
 Not presently implemented with mingw-64 compilers - crashes perl.

sin_cq($rop, $op);
 Sets $rop to sin($op). Wraps C's 'csinq' function.
 Not presently implemented with mingw-64 compilers - crashes perl.

tan_cq($rop, $op);
 Sets $rop to tan($op). Wraps C's 'ctanq' function.
 Not presently implemented with mingw-64 compilers - crashes perl.
 Implemented as sin divided by cos in those situations where the
 Makefile.PL's investigations have indicated that the bug is
 present. Math::Complex_C::Q::_gcc_tan_bug() returns true iff the
 workaround has been implemented.

acosh_cq($rop, $op);
 Sets $rop to acosh($op). Wraps C's 'cacoshq' function.

asinh_cq($rop, $op);
 Sets $rop to asinh($op). Wraps C's 'casinhq' function.

atanh_cq($rop, $op);
 Sets $rop to atanh($op). Wraps C's 'catanhq' function.

cosh_cq($rop, $op);
 Sets $rop to cosh($op). Wraps C's 'ccoshq' function.
 Not presently implemented with mingw-64 compilers - crashes perl.

sinh_cq($rop, $op);
 Sets $rop to sinh($op). Wraps C's 'csinhq' function.
 Not presently implemented with mingw-64 compilers - crashes perl.

tanh_cq($rop, $op);
 Sets $rop to tanh($op). Wraps C's 'ctanhq' function.
 Not presently implemented with mingw-64 compilers - crashes perl.
 Implemented as sinh divided by cosh in those situations where the
 Makefile.PL's investigations have indicated that the bug is
 present. Math::Complex_C::Q::_gcc_tan_bug() returns true iff the
 workaround has been implemented.

exp_cq($rop, $op);
 Sets $rop to e ** $op. Wraps C's 'cexpq' function.
 Not presently implemented with mingw-64 compilers - crashes perl.

log_cq($rop, $op);
 Sets $rop to log($op). Wraps C's 'clogq' function.
 Not presently implemented with mingw-64 compilers - crashes perl.

pow_cq($rop, $op1, $op2);
 Sets $rop to $op1 ** $op2. Wraps C's 'cpowq' function.
 Not presently implemented with mingw-64 compilers - crashes perl.

sqrt_cq($rop, $op);
 Sets $rop to sqrt($op). Wraps C's 'csqrtq' function.

proj_cq($rop, $op);
 Sets $rop to a projection of $op onto the Riemann sphere.
 Wraps C's 'cprojq' function.

$nv = get_nanq();
 Sets $nv to NaN.

$nv = get_infq();
 Sets $nv to Inf.

$bool = is_nanq($nv);
 Returns true if $nv is a NaN - else returns false

$bool = is_infq($nv);
 Returns true if $nv is -Inf or +Inf - else returns false

OUTPUT FUNCTIONS

Default precision for output of Math::Complex_C::Q objects is 33
decimal digits.

This default can be altered using q_set_prec (see below).

q_set_prec($si);
$si = q_get_prec();
 Set/get the precision of output values

$str = q_to_str($op);
 Return a string of the form "real imag".
 Both "real" and "imag" will be expressed in scientific
 notation, to the precision returned by the q_get_prec() function (above).
 Use q_set_prec() to alter this precision.
 Infinities are stringified to 'inf' (or '-inf' for -ve infinity).
 NaN values (including positive and negative NaN vlaues) are stringified to
 'nan'.

$str = q_to_strp($op, $si);
 As for q_to_str, except that the precision setting for the output value
 is set by the 2nd arg (which must be greater than 1).

$rop = str_to_q($str);
 Takes a string as per that returned by q_to_str() or q_to_strp().
 Returns a Math::Complex_C::Q object set to the value represented by that
 string.

cq2F($f_r, $f_i, $op);
 Assign the real part of $op to the Math::Float128 object $f_r, and the
 imaginary part of $op to the Math::Float128 object $f_i.

OPERATOR OVERLOADING

Math::Complex_C::Q overloads the following operators:
 *, +, /, -, **,
 *=, +=, /=, -=, **=,
 !, bool,
 ==, !=,
 "",
 abs, exp, log, cos, sin, atan2, sqrt,
 =

 NOTE: Making use of the '=' overloading is not recommended unless
       you understand its caveats. See 'perldoc overload' and
       read it thoroughly, including the documentation regarding
       'copy constructors'.

 Note: abs() returns an NV, not a Math::Complex_C::Q object. If your NV-type
       is not __float128 then you should probably call abs_cq2F() or
       abs_cq2str() instead. Check the documentation (above) of those two
       alternatives.

 Note: With mingw-w64 compilers exp, log, sin, cos, ** and **= overloading
       is not provided because calling the underlying C functions crashes
       perl.  (TODO: This may no longer be the case.)

 Overloaded arithmetic operations are provided the following types:
  IV, UV, NV, PV, Math::Complex_C::Q object.
 The IV, UV, NV and PV values are real only (ie no imaginary component). The
 PV values will be converted to __float128 values using C's strtoflt128()
 function. The IV, UV and NV values will be cast to __float128 values.

 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".)

OTHER FUNCTIONS

$iv = Math::Complex_C::Q::nnumflag(); # not exported
 Returns the value of the non-numeric flag. This flag is
 initialized to zero, but incemented by 1 whenever a function
 is handed a string containing non-numeric characters. The
 value of the flag therefore tells us how many times functions
 have been handed such a string. The flag can be reset to 0 by
 running clear_nnum().

Math::Complex_C::Q::set_nnum($iv); # not exported
 Resets the global non-numeric flag to the value specified by
 $iv.

Math::Complex_C::Q::clear_nnum(); # not exported
 Resets the global non-numeric flag to 0.(Essentially the same
 as running set_nnum(0).)

LICENSE

This module is free software; you may redistribute it and/or
modify it under the same terms as Perl itself.
Copyright 2014-17, Sisyphus.

AUTHOR

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