|
1 | 1 | #! nqp
|
2 | 2 | use nqpmo;
|
3 | 3 |
|
4 |
| -plan(89); |
| 4 | +plan(97); |
5 | 5 |
|
6 | 6 | my $knowhow := nqp::knowhow();
|
7 | 7 | my $bi_type := $knowhow.new_type(:name('TestBigInt'), :repr('P6bigint'));
|
8 | 8 | $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 | + |
9 | 13 | sub str($x) { nqp::tostr_I($x) };
|
10 | 14 | sub iseq($x, $y) { nqp::iseq_I($x, nqp::box_i($y, $bi_type)) }
|
11 | 15 | 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
|
92 | 96 | ok(nqp::unbox_i(nqp::getattr($box_val_3, $bi_boxer, '$!value')) == 7, "you can extract it and then unbox it");
|
93 | 97 |
|
94 | 98 |
|
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); |
99 | 100 | 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 | +} |
102 | 133 |
|
103 | 134 | # test conversion to float
|
104 | 135 | # try it with 2 ** 100, because that's big enough not to fit into a single
|
105 | 136 | # 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); |
107 | 138 | 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); |
109 | 140 | ok(nqp::iseq_n(nqp::tonum_I($big), nqp::pow_n(-2, 101)), '(-2)**101 to float');
|
110 | 141 | # the mantissa can hold much information accurately, so test that too
|
111 | 142 | my $factor := 123456789;
|
@@ -148,8 +179,8 @@ ok(str(nqp::expmod_I(
|
148 | 179 |
|
149 | 180 | ok(nqp::div_In(box(1234500), box(100)) == 12345, 'div_In santiy');
|
150 | 181 | 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), |
153 | 184 | );
|
154 | 185 | ok(nqp::abs_n($n - 19.6430286394751) < 1e-10, 'div_In with big numbers');
|
155 | 186 |
|
|
0 commit comments