File Coverage

blib/lib/Math/Complex_C/L.pm
Criterion Covered Total %
statement 48 62 77.4
branch 24 48 50.0
condition 4 9 44.4
subroutine 9 9 100.0
pod 0 5 0.0
total 85 133 63.9


line stmt bran cond sub pod time code
1 16     16   7394 use strict;
  16         103  
  16         390  
2 16     16   78 use warnings;
  16         26  
  16         3480  
3             package Math::Complex_C::L;
4              
5             require Exporter;
6             *import = \&Exporter::import;
7             require DynaLoader;
8              
9             use overload
10 16         314 '**' => \&_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 16     16   15651 ;
  16         14336  
34              
35             our $VERSION = '0.07';
36              
37             Math::Complex_C::L->DynaLoader::bootstrap($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 16     16 0 6999 sub dl_load_flags {0} # Prevent DynaLoader from complaining and croaking
69              
70             sub l_to_str {
71 5     5 0 42 return join ' ', _l_to_str($_[0]);
72             }
73              
74             sub l_to_strp {
75 3     3 0 22 return join ' ', _l_to_strp($_[0], $_[1]);
76             }
77              
78             sub str_to_l {
79 1     1 0 8 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       4 $im = get_nanl() if $im =~ /^(\+|\-)?nan/i;
84              
85 1 50       4 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       4 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         3 return MCL($re, $im);
96             }
97              
98             sub _overload_string {
99 7     7   143 my($real, $imag) = (real_cl($_[0]), imag_cl($_[0]));
100 7         44 my($r, $i) = _l_to_str($_[0]);
101              
102 7 50       26 if($real == 0) {
    100          
    50          
103 0 0       0 $r = $real =~ /^\-/ ? '-0' : '0';
104             }
105             elsif($real != $real) {
106 4         7 $r = 'NaN';
107             }
108             elsif(($real / $real) != ($real / $real)) {
109 0 0       0 $r = $real < 0 ? '-Inf' : 'Inf';
110             }
111             else {
112 3         14 my @re = split /e/i, $r;
113 3   33     47 while(substr($re[0], -1, 1) eq '0' && substr($re[0], -2, 1) ne '.') {
114 0         0 chop $re[0];
115             }
116 3         9 $r = $re[0] . 'e' . $re[1];
117             }
118              
119 7 50       20 if($imag == 0) {
    100          
    50          
120 0 0       0 $i = $imag =~ /^\-/ ? '-0' : '0';
121             }
122             elsif($imag != $imag) {
123 4         5 $i = 'NaN';
124             }
125             elsif(($imag / $imag) != ($imag / $imag)) {
126 0 0       0 $i = $imag < 0 ? '-Inf' : 'Inf';
127             }
128             else {
129 3         15 my @im = split /e/i, $i;
130 3   33     10 while(substr($im[0], -1, 1) eq '0' && substr($im[0], -2, 1) ne '.') {
131 0         0 chop $im[0];
132             }
133 3         8 $i = $im[0] . 'e' . $im[1];
134             }
135              
136 7         46 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 73 100   73 0 2072 if(!@_) {return create_cl()}
  9         69  
151              
152 64 50       129 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 64 100 66     281 if(!ref($_[0]) && $_[0] eq "Math::Complex_C::L") {
158 11         18 shift;
159 11 100       23 if(!@_) {return create_cl()}
  2         23  
160             }
161              
162 62 50       118 if(@_ > 2) {die "Bad argument list supplied to new()"}
  0         0  
163              
164 62         70 my $ret;
165              
166 62 100       113 if(@_ == 2) {
167 51         356 $ret = create_cl();
168 51         167 assign_cl($ret, $_[0], $_[1]);
169             }
170             else {
171 11 50       49 return $_[0] if _itsa($_[0]) == 226;
172 11         28 $ret = create_cl();
173 11         22 assign_cl($ret, $_[0], 0.0);
174             }
175              
176 62         291 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__