File Coverage

blib/lib/Math/Complex_C/L.pm
Criterion Covered Total %
statement 45 62 72.5
branch 22 48 45.8
condition 4 9 44.4
subroutine 9 9 100.0
pod 0 5 0.0
total 80 133 60.1


line stmt bran cond sub pod time code
1 15     15   5879 use strict;
  15         84  
  15         318  
2 15     15   61 use warnings;
  15         18  
  15         2928  
3             package Math::Complex_C::L;
4              
5             require Exporter;
6             *import = \&Exporter::import;
7             require DynaLoader;
8              
9             use overload
10 15         251 '**' => \&_overload_pow,
11             '*' => \&_overload_mul,
12             '+' => \&_overload_add,
13             '/' => \&_overload_div,
14             '-' => \&_overload_sub,
15             '**=' => \&_overload_pow_eq,
16             '*=' => \&_overload_mul_eq,
17             '+=' => \&_overload_add_eq,
18             '/=' => \&_overload_div_eq,
19             '-=' => \&_overload_sub_eq,
20             'sqrt' => \&_overload_sqrt,
21             '==' => \&_overload_equiv,
22             '!=' => \&_overload_not_equiv,
23             '!' => \&_overload_not,
24             'bool' => \&_overload_true,
25             '=' => \&_overload_copy,
26             '""' => \&_overload_string,
27             'abs' => \&_overload_abs,
28             'exp' => \&_overload_exp,
29             'log' => \&_overload_log,
30             'sin' => \&_overload_sin,
31             'cos' => \&_overload_cos,
32             'atan2' => \&_overload_atan2,
33 15     15   12908 ;
  15         12218  
34              
35             our $VERSION = '0.06';
36              
37             DynaLoader::bootstrap Math::Complex_C::L $VERSION;
38              
39             @Math::Complex_C::L::EXPORT = ();
40             @Math::Complex_C::L::EXPORT_OK = qw(
41              
42             create_cl assign_cl mul_cl mul_c_nvl mul_c_ivl mul_c_uvl div_cl div_c_nvl div_c_ivl div_c_uvl add_cl
43             add_c_nvl add_c_ivl add_c_uvl sub_cl sub_c_nvl sub_c_ivl sub_c_uvl real_cl real_cl2LD imag_cl2LD
44             LD2cl cl2LD real_cl2str imag_cl2str arg_cl2LD arg_cl2str abs_cl2LD abs_cl2str
45             imag_cl arg_cl abs_cl conj_cl acos_cl asin_cl atan_cl cos_cl sin_cl tan_cl acosh_cl asinh_cl atanh_cl
46             cosh_cl sinh_cl tanh_cl exp_cl log_cl sqrt_cl proj_cl pow_cl
47             get_nanl get_neg_infl get_infl is_nanl is_infl MCL
48             add_c_pvl sub_c_pvl mul_c_pvl div_c_pvl
49              
50             str_to_l l_to_str l_to_strp l_set_prec l_get_prec set_real_cl set_imag_cl
51             ld_to_str ld_to_strp long_set_prec long_get_prec
52             );
53              
54             %Math::Complex_C::L::EXPORT_TAGS = (all => [qw(
55              
56             create_cl assign_cl mul_cl mul_c_nvl mul_c_ivl mul_c_uvl div_cl div_c_nvl div_c_ivl div_c_uvl add_cl
57             add_c_nvl add_c_ivl add_c_uvl sub_cl sub_c_nvl sub_c_ivl sub_c_uvl real_cl real_cl2LD imag_cl2LD
58             LD2cl cl2LD real_cl2str imag_cl2str arg_cl2LD arg_cl2str abs_cl2LD abs_cl2str
59             imag_cl arg_cl abs_cl conj_cl acos_cl asin_cl atan_cl cos_cl sin_cl tan_cl acosh_cl asinh_cl atanh_cl
60             cosh_cl sinh_cl tanh_cl exp_cl log_cl sqrt_cl proj_cl pow_cl
61             get_nanl get_neg_infl get_infl is_nanl is_infl MCL
62             add_c_pvl sub_c_pvl mul_c_pvl div_c_pvl
63              
64             str_to_l l_to_str l_to_strp l_set_prec l_get_prec set_real_cl set_imag_cl
65             ld_to_str ld_to_strp long_set_prec long_get_prec
66             )]);
67              
68 15     15 0 5520 sub dl_load_flags {0} # Prevent DynaLoader from complaining and croaking
69              
70             sub l_to_str {
71 5     5 0 67 return join ' ', _l_to_str($_[0]);
72             }
73              
74             sub l_to_strp {
75 3     3 0 27 return join ' ', _l_to_strp($_[0], $_[1]);
76             }
77              
78             sub str_to_l {
79 1     1 0 10 my($re, $im) = split /\s+/, $_[0];
80 1 50       5 $im = 0 if !defined($im);
81              
82 1 50       7 $re = get_nanl() if $re =~ /^(\+|\-)?nan/i;
83 1 50       5 $im = get_nanl() if $im =~ /^(\+|\-)?nan/i;
84              
85 1 50       6 if($re =~ /^(\+|\-)?inf/i) {
86 0 0       0 if($re =~ /^\-inf/i) {$re = get_neg_infl()}
  0         0  
87 0         0 else {$re = get_infl()}
88             }
89              
90 1 50       5 if($im =~ /^(\+|\-)?inf/i) {
91 0 0       0 if($re =~ /^\-inf/i) {$im = get_neg_infl()}
  0         0  
92 0         0 else {$im = get_infl()}
93             }
94              
95 1         4 return MCL($re, $im);
96             }
97              
98             sub _overload_string {
99 7     7   184 my($real, $imag) = (real_cl($_[0]), imag_cl($_[0]));
100 7         63 my($r, $i) = _l_to_str($_[0]);
101              
102 7 50       36 if($real == 0) {
    100          
    50          
103 0 0       0 $r = $real =~ /^\-/ ? '-0' : '0';
104             }
105             elsif($real != $real) {
106 4         10 $r = 'NaN';
107             }
108             elsif(($real / $real) != ($real / $real)) {
109 0 0       0 $r = $real < 0 ? '-Inf' : 'Inf';
110             }
111             else {
112 3         15 my @re = split /e/i, $r;
113 3   33     34 while(substr($re[0], -1, 1) eq '0' && substr($re[0], -2, 1) ne '.') {
114 0         0 chop $re[0];
115             }
116 3         11 $r = $re[0] . 'e' . $re[1];
117             }
118              
119 7 50       27 if($imag == 0) {
    100          
    50          
120 0 0       0 $i = $imag =~ /^\-/ ? '-0' : '0';
121             }
122             elsif($imag != $imag) {
123 4         6 $i = 'NaN';
124             }
125             elsif(($imag / $imag) != ($imag / $imag)) {
126 0 0       0 $i = $imag < 0 ? '-Inf' : 'Inf';
127             }
128             else {
129 3         19 my @im = split /e/i, $i;
130 3   33     12 while(substr($im[0], -1, 1) eq '0' && substr($im[0], -2, 1) ne '.') {
131 0         0 chop $im[0];
132             }
133 3         10 $i = $im[0] . 'e' . $im[1];
134             }
135              
136 7         48 return "(" . $r . " " . $i . ")";
137             }
138              
139             sub new {
140              
141              
142             # This function caters for 2 possibilities:
143             # 1) that 'new' has been called OOP style - in which
144             # case there will be a maximum of 3 args
145             # 2) that 'new' has been called as a function - in
146             # which case there will be a maximum of 2 args.
147             # If there are no args, then we just want to return a
148             # Math::Complex_C::L object
149              
150 62 100   62 0 1531 if(!@_) {return create_cl()}
  9         67  
151              
152 53 50       103 if(@_ > 3) {die "Too many arguments supplied to new()"}
  0         0  
153              
154             # If 'new' has been called OOP style, the first arg is the string
155             # "Math::Complex_C::L" which we don't need - so let's remove it.
156              
157 53 100 66     204 if(!ref($_[0]) && $_[0] eq "Math::Complex_C::L") {
158 10         13 shift;
159 10 100       22 if(!@_) {return create_cl()}
  2         25  
160             }
161              
162 51 50       95 if(@_ > 2) {die "Bad argument list supplied to new()"}
  0         0  
163              
164 51         52 my $ret;
165              
166 51 50       85 if(@_ == 2) {
167 51         295 $ret = create_cl();
168 51         212 assign_cl($ret, $_[0], $_[1]);
169             }
170             else {
171 0 0       0 return $_[0] if _itsa($_[0]) == 226;
172 0         0 $ret = create_cl();
173 0         0 assign_cl($ret, $_[0], 0.0);
174             }
175              
176 51         208 return $ret;
177             }
178              
179             *MCL = \&Math::Complex_C::L::new;
180             *long_get_prec = \&l_get_prec; # for backwards-compatibility
181             *long_set_prec = \&l_set_prec; # for backwards-compatibility
182             *ld_to_str = \&l_to_str; # for backwards-compatibility
183             *ld_to_strp = \&l_to_strp; # for backwards-compatibility
184              
185             1;
186              
187             __END__