use strict;
use warnings;
-our ($CLASS, $try, $x, $y, $z, $f, @args, $want, $got, $setup, $CALC);
+our ($CLASS, $try, $x, $y, $z, $f, @args, $want, $got, $setup, $LIB);
-is($CLASS->config()->{lib}, $CALC);
+is($CLASS->config()->{lib}, $LIB);
$setup = '';
} elsif ($f eq "finf") {
my $a = $args[1] || '';
$try .= qq| \$x->binf("$a");|;
- } elsif ($f eq "is_inf") {
- $try .= qq| \$x->is_inf("$args[1]");|;
} elsif ($f eq "fone") {
$try .= qq| \$x->bone("$args[1]");|;
} elsif ($f eq "fstr") {
} elsif ($f =~ /^(log|exp|sin|cos|atan2|int|neg|abs|sqrt)$/) {
$try .= " \$x = $f(\$x);";
# some is_xxx test function
- } elsif ($f =~ /^is_(zero|one|pos|neg|negative|positive|odd|even|nan|int)\z/) {
+ } elsif ($f =~ /^is_(zero|pos|neg|negative|positive|odd|even|nan|int)\z/) {
$try .= " \$x->$f();";
+ } elsif ($f =~ /^is_(one|inf)$/) {
+ $try .= @args == 1 ? qq| \$x->$f();|
+ : qq| \$x->$f("$args[1]");|;
} elsif ($f =~ /^(as_number|as_int)\z/) {
$try .= " \$x->$1();";
} elsif ($f eq "finc") {
} elsif ($f eq "bacmp") {
$try .= ' $x->bacmp($y);';
} elsif ($f eq "bpow") {
- $try .= ' $x ** $y;';
- } elsif ($f eq "fpow") {
$try .= ' $x->bpow($y);';
} elsif ($f eq "badd") {
$try .= ' $x + $y;';
is($x->{_p}, undef, qq|\$x = $CLASS->new(2); \$x->bnan(); \$x->{_p}|);
__DATA__
+
&digit
123:2:1
1234:0:4
1234:-4:4
0:0:0
0:1:0
+
&bmodinv
# format: number:modulus:result
# bmodinv Data errors
5:inf:NaN
-inf:5:NaN
5:-inf:NaN
+
&as_number
144/7:20
12/1:12
NaN:NaN
+inf:inf
-inf:-inf
+
&as_int
144/7:20
12/1:12
NaN:NaN
+inf:inf
-inf:-inf
+
&bmodpow
# format: number:exponent:modulus:result
# bmodpow Data errors
8:-1:16:NaN
inf:5:13:NaN
5:inf:13:NaN
+
&bmod
NaN:1:NaN
1:NaN:NaN
-7/4:4/28:3/28
7/4:-4/28:-3/28
-7/4:-4/28:-1/28
+
&fsqrt
1:1
0:0
144/4:6
25/16:5/4
-3:NaN
+4/9:2/3
+36/49:6/7
+49/121:7/11
+999966000289/99999820000081:999983/9999991
+
&flog
NaN:NaN
0:-inf
-2:NaN
+
&blog
NaN:NaN:NaN
0:NaN:NaN
0:2:-inf
0:-2:NaN
3:-2:NaN
+
&finf
1:+:inf
2:-:-inf
3:abc:inf
+
&numify
0:0
+1:1
NaN:NaN
+inf:inf
-inf:-inf
+
&fnan
abc:NaN
2:NaN
-2:NaN
0:NaN
+
&fone
2:+:1
-2:-:-1
-2::1
abc::1
2:abc:1
+
&fsstr
+inf:inf
-inf:-inf
1:1/1
3/1:3/1
0.1:1/10
+
&bnorm
1:1
-0:0
1 / 3:1/3
1/ 3:1/3
1 /3:1/3
+
&fneg
fnegNaN:NaN
+inf:-inf
123/7:-123/7
-123/7:123/7
123/-7:123/7
+
&fabs
fabsNaN:NaN
+inf:inf
-123456789:123456789
+123.456789:123456789/1000000
-123456.789:123456789/1000
+
&badd
abc:abc:NaN
abc:+0:NaN
+123456789:-987654321:-864197532
1/3:1/3:2/3
2/3:-1/3:1/3
+
&bsub
abc:abc:NaN
abc:+0:NaN
-2/3:-2/3:0
0:-123:123
0:123:-123
+
&bmul
abc:abc:NaN
abc:+0:NaN
6:120:720
10:10000:100000
1/4:1/3:1/12
+
&bdiv-list
0:0:NaN,0
0:1:0,0
-9:-4:2,-1
11/7:2/3:2,5/21
-11/7:2/3:-3,3/7
+
&bdiv
$div_scale = 40; $round_mode = "even"
abc:abc:NaN
1/4:1/3:3/4
# reset scale for further tests
$div_scale = 40
+
&is_nan
123:0
abc:1
NaN:1
-123:0
+
&is_inf
-+inf::1
--inf::1
-abc::0
-1::0
-NaN::0
--1::0
-+inf:-:0
+# without sign argument
+abc:0
+NaN:0
++inf:1
+-inf:1
+-1:0
+0:0
+1:0
+# with sign argument "+"
+abc:+:0
+NaN:+:0
+inf:+:1
--inf:-:1
-inf:+:0
-+infinity::1
--infinity::1
+-1:+:0
+0:+:0
+1:+:0
+# with sign argument "-"
+abc:-:0
+NaN:-:0
++inf:-:0
+-inf:-:1
+-1:-:0
+0:-:0
+1:-:0
++infinity:1
+-infinity:1
+
&is_odd
abc:0
0:0
123.45:0
-123.45:0
2:0
+
&is_int
NaNis_int:0
0:1
-0.002:0
1/3:0
3/1:1
+
&is_even
abc:0
0:1
120:1
1200:1
-1200:1
+
&is_pos
0:0
1:1
NaN:0
-inf:0
+inf:1
+
&is_positive
0:0
1:1
NaN:0
-inf:0
+inf:1
+
&is_neg
0:0
1:0
NaN:0
-inf:1
+inf:0
+
&is_negative
0:0
1:0
NaN:0
-inf:1
+inf:0
+
&parts
0:0 1
1:1 1
NaNparts:NaN NaN
+inf:inf inf
-inf:-inf inf
+
&length
123:3
-123:3
0:1
1:1
12345678901234567890:20
+
&is_zero
NaNzero:0
+inf:0
1/3:0
-0/3:1
5/inf:1
+
&is_one
-NaNone:0
+# with no sign argument
+invalid:0
+NaN:0
+inf:0
-inf:0
+-2:0
+-1:0
0:0
-2:0
1:1
--1:0
-2:0
+# with sign argument "+"
+invalid:+:0
+NaN:+:0
++inf:+:0
+-inf:+:0
+-2:+:0
+-1:+:0
+0:+:0
+1:+:1
+-2:+:0
+# with sign argument "-"
+invalid:-:0
+NaN:-:0
++inf:-:0
+-inf:-:0
+-2:-:0
+-1:-:1
+0:-:0
+1:-:0
+-2:-:0
1/3:0
100/100:1
0.1/0.1:1
5/inf:0
+
&ffloor
0:0
abc:NaN
-13/7:-2
-14/7:-2
-15/7:-3
+
&fceil
0:0
abc:NaN
-13/7:-1
-14/7:-2
-15/7:-2
+
&ffac
NaN:NaN
1:1
-1:NaN
+
&bpow
-# bpow test for overload of **
+#
+abc:123:NaN
+123:abc:NaN
+#
+-inf:-inf:0
+-inf:-3:0
+-inf:-2:0
+-inf:-3/2:0
+-inf:-1:0
+-inf:-1/2:0
+-inf:0:NaN
+-inf:1/2:inf # directed infinity
+-inf:1:-inf
+-inf:3/2:inf # directed infinity
+-inf:2:inf
+-inf:3:-inf
+-inf:inf:inf # complex infinity
+-inf:NaN:NaN
+#
+-3:-inf:0
+-3:-3:-1/27
+-3:-2:1/9
+-3:-3/2:NaN
+-3:-1:-1/3
+-3:-1/2:NaN
+-3:0:1
+-3:1/2:NaN
+-3:1:-3
+-3:3/2:NaN
+-3:2:9
+-3:3:-27
+-3:inf:inf # complex infinity
+-3:NaN:NaN
+#
+-2:-inf:0
+-2:-3:-1/8
+-2:-2:1/4
+-2:-3/2:NaN
+-2:-1:-1/2
+-2:-1/2:NaN
+-2:0:1
+-2:1/2:NaN
+-2:1:-2
+-2:3/2:NaN
+-2:2:4
+-2:3:-8
+-2:inf:inf # complex infinity
+-2:NaN:NaN
+#
+-3/2:-inf:0
+-3/2:-3:-8/27
+-3/2:-2:4/9
+-3/2:-3/2:NaN
+-3/2:-1:-2/3
+-3/2:-1/2:NaN
+-3/2:0:1
+-3/2:1/2:NaN
+-3/2:1:-3/2
+-3/2:3/2:NaN
+-3/2:2:9/4
+-3/2:3:-27/8
+-3/2:inf:inf # complex infinity
+-3/2:NaN:NaN
+#
+-1:-inf:NaN
+-1:-3:-1
+-1:-2:1
+-1:-3/2:NaN
+-1:-1:-1
+-1:-1/2:NaN
+-1:0:1
+-1:1/2:NaN
+-1:1:-1
+-1:3/2:NaN
+-1:2:1
+-1:3:-1
+-1:inf:NaN
+-1:NaN:NaN
+#
+-1/2:-inf:inf # complex infinity
+-1/2:-3:-8
+-1/2:-2:4
+-1/2:-3/2:NaN
+-1/2:-1:-2
+-1/2:-1/2:NaN
+-1/2:0:1
+-1/2:1/2:NaN
+-1/2:1:-1/2
+-1/2:3/2:NaN
+-1/2:2:1/4
+-1/2:3:-1/8
+-1/2:inf:0
+-1/2:NaN:NaN
+#
+0:-inf:inf # complex infinity
+0:-3:inf # complex infinity
+0:-2:inf # complex infinity
+0:-3/2:inf # complex infinity
+0:-1:inf # complex infinity
+0:-1/2:inf # complex infinity
+0:0:1
+0:1/2:0
+0:1:0
+0:3/2:0
+0:2:0
+0:3:0
+0:inf:0
+0:NaN:NaN
+#
+1/2:-inf:inf
+1/2:-3:8
+1/2:-2:4
+#1/2:-3/2:2.828427124746190097603377448419396157139
+1/2:-1:2
+#1/2:-1/2:1.41421356237309504880168872420969807857
+1/2:0:1
+#1/2:1/2:0.7071067811865475244008443621048490392848
+1/2:1:1/2
+#1/2:3/2:0.3535533905932737622004221810524245196424
+1/2:2:1/4
+1/2:3:1/8
+1/2:inf:0
+1/2:NaN:NaN
+#
+1:-inf:1
+1:-3:1
+1:-2:1
+1:-3/2:1
+1:-1:1
+1:-1/2:1
+1:0:1
+1:1/2:1
+1:1:1
+1:3/2:1
+1:2:1
+1:3:1
+1:inf:1
+1:NaN:NaN
+#
+3/2:-inf:0
+3/2:-3:8/27
+3/2:-2:4/9
+#3/2:-3/2:0.5443310539518173551549520166013091982147
+3/2:-1:2/3
+#3/2:-1/2:0.816496580927726032732428024901963797322
+3/2:0:1
+#3/2:1/2:1.224744871391589049098642037352945695983
+3/2:1:3/2
+#3/2:3/2:1.837117307087383573647963056029418543974
+3/2:2:9/4
+3/2:3:27/8
+3/2:inf:inf
+3/2:NaN:NaN
+#
+2:-inf:0
+2:-3:1/8
+2:-2:1/4
+#2:-3/2:0.3535533905932737622004221810524245196424
+2:-1:1/2
+#2:-1/2:0.7071067811865475244008443621048490392848
+2:0:1
+#2:1/2:1.41421356237309504880168872420969807857
+2:1:2
+#2:3/2:2.828427124746190097603377448419396157139
2:2:4
+2:3:8
+2:inf:inf
+2:NaN:NaN
+#
+3:-inf:0
+3:-3:1/27
+3:-2:1/9
+#3:-3/2:0.1924500897298752548363829268339858185492
+3:-1:1/3
+#3:-1/2:0.5773502691896257645091487805019574556476
+3:0:1
+#3:1/2:1.732050807568877293527446341505872366943
+3:1:3
+#3:3/2:5.196152422706631880582339024517617100828
+3:2:9
3:3:27
+3:inf:inf
+3:NaN:NaN
+#
+inf:-inf:0
+inf:-3:0
+inf:-2:0
+inf:-3/2:0
+inf:-1:0
+inf:-1/2:0
+inf:0:NaN
+inf:1/2:inf
+inf:1:inf
+inf:3/2:inf
+inf:2:inf
+inf:3:inf
+inf:inf:inf
+inf:NaN:NaN
+#
+NaN:-inf:NaN
+NaN:-3:NaN
+NaN:-2:NaN
+NaN:-3/2:NaN
+NaN:-1:NaN
+NaN:-1/2:NaN
+NaN:0:NaN
+NaN:1/2:NaN
+NaN:1:NaN
+NaN:3/2:NaN
+NaN:2:NaN
+NaN:3:NaN
+NaN:inf:NaN
+NaN:NaN:NaN
+
&bacmp
+0:-0:0
+0:+1:-1
1/3:2/3:-1
2/3:1/3:1
2/3:2/3:0
-&fpow
-2/1:3/1:8
-3/1:3/1:27
-5/2:3/1:125/8
--2/1:3/1:-8
--3/1:3/1:-27
--5/2:3/1:-125/8
--2/1:4/1:16
--3/1:4/1:81
--5/2:4/1:625/16
--5/2:-4/1:16/625
-1/5:-3:125
--1/5:-3:-125
+
&numerator
NaN:NaN
inf:inf
0:0
1:1
5/-3:-5
+
&denominator
NaN:NaN
inf:1
-1/1:1
-3/7:7
4/-5:5
+
&finc
3/2:5/2
-15/6:-3/2
NaN:NaN
-1/3:2/3
-2/7:5/7
+
&fdec
15/6:3/2
-3/2:-5/2
1/3:-2/3
2/7:-5/7
NaN:NaN
+
&log
-1:NaN
0:-inf
-inf:inf
inf:inf
NaN:NaN
+
&exp
+
&sin
+
&cos
+
&atan2
+
&int
+
&abs
+
&sqrt