Skip to content

Commit fb3fa50

Browse files
committed
Test nqp::pow_I more (check if it handles -1 ** large_number, returns nqp::inf when overflowing etc.).
1 parent 8151d0c commit fb3fa50

File tree

1 file changed

+42
-11
lines changed

1 file changed

+42
-11
lines changed

t/nqp/060-bigint.t

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
#! nqp
22
use nqpmo;
33

4-
plan(89);
4+
plan(97);
55

66
my $knowhow := nqp::knowhow();
77
my $bi_type := $knowhow.new_type(:name('TestBigInt'), :repr('P6bigint'));
88
$bi_type.HOW.compose($bi_type);
9+
10+
my $n_type := nqp::knowhow().new_type(:name('TestNum'), :repr('P6num'));
11+
$n_type.HOW.compose($n_type);
12+
913
sub str($x) { nqp::tostr_I($x) };
1014
sub iseq($x, $y) { nqp::iseq_I($x, nqp::box_i($y, $bi_type)) }
1115
sub box($x) { nqp::box_i($x, $bi_type) }
@@ -92,20 +96,47 @@ ok(nqp::istype(nqp::getattr($box_val_3, $bi_boxer, '$!value'), $bi_type), "the b
9296
ok(nqp::unbox_i(nqp::getattr($box_val_3, $bi_boxer, '$!value')) == 7, "you can extract it and then unbox it");
9397

9498

95-
# Note that the last argument to pow_I should be capable of boxing a num,
96-
# so $bi_type is wrong here. But so far we only test the integer case,
97-
# so we can get away with it.
98-
my $big := nqp::pow_I($c, box(42), $bi_type, $bi_type);
99+
my $big := nqp::pow_I($c, box(42), $n_type, $bi_type);
99100
is(str($big), '5970554685064519004265641008828923248442340700473500698131071806779372733915289638628729', 'pow (int, positive)');
100-
ok(iseq(nqp::pow_I(box(0), $big, $bi_type, $bi_type), 0), 'pow 0 ** large_number');
101-
ok(iseq(nqp::pow_I($one, $big, $bi_type, $bi_type), 1), 'pow 1 ** large_number');
101+
ok(iseq(nqp::pow_I(box(0), $big, $n_type, $bi_type), 0), 'pow 0 ** large_number');
102+
103+
my $big_even := nqp::fromstr_I('597055468506451900426564100882892324844234070047350069813107180677937273391528963862870004', $bi_boxer);
104+
my $big_odd := nqp::fromstr_I('597055468506451900426564100882892324844234070047350069813107180677937273391528963862870003', $bi_boxer);
105+
106+
is(str(nqp::pow_I(box(1), $big_even, $n_type, $bi_type)), 1, 'pow 1 ** large_even_number');
107+
is(str(nqp::pow_I(box(1), $big_odd, $n_type, $bi_type)), 1, 'pow 1 ** large_odd_number');
108+
109+
is(str(nqp::pow_I(box(-1), $big_even, $n_type, $bi_type)), 1, 'pow -1 ** large_even_number');
110+
is(str(nqp::pow_I(box(-1), $big_odd, $n_type, $bi_type)), -1, 'pow -1 ** large_odd_number');
111+
112+
{
113+
my $r := nqp::pow_I(box(-2), $big_even, $n_type, $bi_type);
114+
ok($r == nqp::inf() && nqp::istype($r, $n_type), 'pow -2 ** large_even_number');
115+
}
116+
{
117+
my $r := nqp::pow_I(box(-2), $big_odd, $n_type, $bi_type);
118+
ok($r == nqp::neginf() && nqp::istype($r, $n_type), 'pow -2 ** large_odd_number');
119+
}
120+
{
121+
my $r := nqp::pow_I(box(2), $big_odd, $n_type, $bi_type);
122+
ok($r == nqp::inf() && nqp::istype($r, $n_type), 'pow 2 ** large_even_number');
123+
}
124+
{
125+
my $r := nqp::pow_I(box(2), $big_even, $n_type, $bi_type);
126+
ok($r == nqp::inf() && nqp::istype($r, $n_type), 'pow 2 ** large_odd_number');
127+
}
128+
129+
{
130+
my $r := nqp::pow_I(box(2), box(-3), $n_type, $bi_type);
131+
ok($r == 0.125 && nqp::istype($r, $n_type), 'pow 2 ** -3');
132+
}
102133

103134
# test conversion to float
104135
# try it with 2 ** 100, because that's big enough not to fit into a single
105136
# int, but can be represented exactly in a double
106-
$big := nqp::pow_I(box(2), box(100), $bi_type, $bi_type);
137+
$big := nqp::pow_I(box(2), box(100), $n_type, $bi_type);
107138
ok(nqp::iseq_n(nqp::tonum_I($big), nqp::pow_n(2, 100)), '2**100 to float');
108-
$big := nqp::pow_I(box(-2), box(101), $bi_type, $bi_type);
139+
$big := nqp::pow_I(box(-2), box(101), $n_type, $bi_type);
109140
ok(nqp::iseq_n(nqp::tonum_I($big), nqp::pow_n(-2, 101)), '(-2)**101 to float');
110141
# the mantissa can hold much information accurately, so test that too
111142
my $factor := 123456789;
@@ -148,8 +179,8 @@ ok(str(nqp::expmod_I(
148179

149180
ok(nqp::div_In(box(1234500), box(100)) == 12345, 'div_In santiy');
150181
my $n := nqp::div_In(
151-
nqp::pow_I(box(203), box(200), $bi_type, $bi_type),
152-
nqp::pow_I(box(200), box(200), $bi_type, $bi_type),
182+
nqp::pow_I(box(203), box(200), $n_type, $bi_type),
183+
nqp::pow_I(box(200), box(200), $n_type, $bi_type),
153184
);
154185
ok(nqp::abs_n($n - 19.6430286394751) < 1e-10, 'div_In with big numbers');
155186

0 commit comments

Comments
 (0)