#!/usr/bin/perl -w
BEGIN
{
$| = 1;
my
$location
= $0;
$location
=~ s/inf_nan.t//i;
if
(
$ENV
{PERL_CORE})
{
@INC
=
qw(../t/lib)
;
}
unshift
@INC
,
'../lib'
;
if
(-d
't'
)
{
chdir
't'
;
unshift
@INC
, File::Spec->catdir(File::Spec->updir,
$location
);
}
else
{
unshift
@INC
,
$location
;
}
print
"# INC = @INC\n"
;
plan
tests
=> 7 * 6 * 5 * 4 * 2 +
7 * 6 * 2 * 4 * 1
;
}
my
@classes
=
qw/Math::BigInt Math::BigFloat
Math::BigInt::Subclass Math::BigFloat::Subclass
/
;
my
(
@args
,
$x
,
$y
,
$z
);
foreach
(
qw/
-inf:-inf:-inf
-1:-inf:-inf
-0:-inf:-inf
0:-inf:-inf
1:-inf:-inf
inf:-inf:NaN
NaN:-inf:NaN
-inf:-1:-inf
-1:-1:-2
-0:-1:-1
0:-1:-1
1:-1:0
inf:-1:inf
NaN:-1:NaN
-inf:0:-inf
-1:0:-1
-0:0:0
0:0:0
1:0:1
inf:0:inf
NaN:0:NaN
-inf:1:-inf
-1:1:0
-0:1:1
0:1:1
1:1:2
inf:1:inf
NaN:1:NaN
-inf:inf:NaN
-1:inf:inf
-0:inf:inf
0:inf:inf
1:inf:inf
inf:inf:inf
NaN:inf:NaN
-inf:NaN:NaN
-1:NaN:NaN
-0:NaN:NaN
0:NaN:NaN
1:NaN:NaN
inf:NaN:NaN
NaN:NaN:NaN
/
)
{
@args
=
split
/:/,
$_
;
for
my
$class
(
@classes
)
{
$x
=
$class
->new(
$args
[0]);
$y
=
$class
->new(
$args
[1]);
$args
[2] =
'0'
if
$args
[2] eq
'-0'
;
my
$r
=
$x
->badd(
$y
);
is(
$x
->bstr(),
$args
[2],
"x $class $args[0] + $args[1]"
);
is(
$x
->bstr(),
$args
[2],
"r $class $args[0] + $args[1]"
);
}
}
foreach
(
qw/
-inf:-inf:NaN
-1:-inf:inf
-0:-inf:inf
0:-inf:inf
1:-inf:inf
inf:-inf:inf
NaN:-inf:NaN
-inf:-1:-inf
-1:-1:0
-0:-1:1
0:-1:1
1:-1:2
inf:-1:inf
NaN:-1:NaN
-inf:0:-inf
-1:0:-1
-0:0:-0
0:0:0
1:0:1
inf:0:inf
NaN:0:NaN
-inf:1:-inf
-1:1:-2
-0:1:-1
0:1:-1
1:1:0
inf:1:inf
NaN:1:NaN
-inf:inf:-inf
-1:inf:-inf
-0:inf:-inf
0:inf:-inf
1:inf:-inf
inf:inf:NaN
NaN:inf:NaN
-inf:NaN:NaN
-1:NaN:NaN
-0:NaN:NaN
0:NaN:NaN
1:NaN:NaN
inf:NaN:NaN
NaN:NaN:NaN
/
)
{
@args
=
split
/:/,
$_
;
for
my
$class
(
@classes
)
{
$x
=
$class
->new(
$args
[0]);
$y
=
$class
->new(
$args
[1]);
$args
[2] =
'0'
if
$args
[2] eq
'-0'
;
my
$r
=
$x
->bsub(
$y
);
is(
$x
->bstr(),
$args
[2],
"x $class $args[0] - $args[1]"
);
is(
$r
->bstr(),
$args
[2],
"r $class $args[0] - $args[1]"
);
}
}
foreach
(
qw/
-inf:-inf:inf
-1:-inf:inf
-0:-inf:NaN
0:-inf:NaN
1:-inf:-inf
inf:-inf:-inf
NaN:-inf:NaN
-inf:-1:inf
-1:-1:1
-0:-1:0
0:-1:-0
1:-1:-1
inf:-1:-inf
NaN:-1:NaN
-inf:0:NaN
-1:0:-0
-0:0:-0
0:0:0
1:0:0
inf:0:NaN
NaN:0:NaN
-inf:1:-inf
-1:1:-1
-0:1:-0
0:1:0
1:1:1
inf:1:inf
NaN:1:NaN
-inf:inf:-inf
-1:inf:-inf
-0:inf:NaN
0:inf:NaN
1:inf:inf
inf:inf:inf
NaN:inf:NaN
-inf:NaN:NaN
-1:NaN:NaN
-0:NaN:NaN
0:NaN:NaN
1:NaN:NaN
inf:NaN:NaN
NaN:NaN:NaN
/
)
{
@args
=
split
/:/,
$_
;
for
my
$class
(
@classes
)
{
$x
=
$class
->new(
$args
[0]);
$y
=
$class
->new(
$args
[1]);
$args
[2] =
'0'
if
$args
[2] eq
'-0'
;
$args
[2] =
'0'
if
$args
[2] eq
'-0'
;
my
$r
=
$x
->bmul(
$y
);
is(
$x
->bstr(),
$args
[2],
"x $class $args[0] * $args[1]"
);
is(
$r
->bstr(),
$args
[2],
"r $class $args[0] * $args[1]"
);
}
}
foreach
(
qw/
-inf:-inf:NaN
-1:-inf:0
-0:-inf:0
0:-inf:-0
1:-inf:-0
inf:-inf:NaN
NaN:-inf:NaN
-inf:-1:inf
-1:-1:1
-0:-1:0
0:-1:-0
1:-1:-1
inf:-1:-inf
NaN:-1:NaN
-inf:0:-inf
-1:0:-inf
-0:0:NaN
0:0:NaN
1:0:inf
inf:0:inf
NaN:0:NaN
-inf:1:-inf
-1:1:-1
-0:1:-0
0:1:0
1:1:1
inf:1:inf
NaN:1:NaN
-inf:inf:NaN
-1:inf:-0
-0:inf:-0
0:inf:0
1:inf:0
inf:inf:NaN
NaN:inf:NaN
-inf:NaN:NaN
-1:NaN:NaN
-0:NaN:NaN
0:NaN:NaN
1:NaN:NaN
inf:NaN:NaN
NaN:NaN:NaN
/
)
{
@args
=
split
/:/,
$_
;
for
my
$class
(
@classes
)
{
$x
=
$class
->new(
$args
[0]);
$y
=
$class
->new(
$args
[1]);
$args
[2] =
'0'
if
$args
[2] eq
'-0'
;
my
$t
=
$x
->copy();
my
$tmod
=
$t
->copy();
my
$r
=
$x
->bdiv(
$y
);
is(
$x
->bstr(),
$args
[2],
"x $class $args[0] / $args[1]"
);
is(
$r
->bstr(),
$args
[2],
"r $class $args[0] / $args[1]"
);
my
(
$d
,
$rem
) =
$t
->bdiv(
$y
);
is(
$t
->bstr(),
$args
[2],
"t $class $args[0] / $args[1]"
);
is(
$d
->bstr(),
$args
[2],
"d $class $args[0] / $args[1]"
);
my
$m
=
$tmod
->bmod(
$y
);
is(
$m
->bstr(),
$rem
->bstr(),
"m $class $args[0] % $args[1]"
);
is(
$tmod
->bstr(),
$m
->bstr(),
"o $class $args[0] % $args[1]"
);
}
}