Skip to content

Commit 026ad8f

Browse files
committed
fix bug in powInt
1 parent b69df7f commit 026ad8f

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

src/math.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,16 @@ export function ipowInt(X: Interval, n: number): Union {
123123
}
124124

125125
if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);
126-
if (n === 0) return new Union([X]);
126+
if (n === 0) return new Union([new Interval(1, 1)]);
127127

128128
if (X.lo > 0 || n % 2 !== 0) {
129129
return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);
130130
} else if (X.hi < 0) {
131131
return new Union([new Interval(leftPowInt(X.hi, n), rightPowInt(X.lo, n))]);
132132
} else {
133-
return new Union([new Interval(0, rightPowInt(Math.abs(X.lo), n))]);
133+
return new Union([
134+
new Interval(0, rightPowInt(Math.max(Math.abs(X.hi), Math.abs(X.lo)), n)),
135+
]);
134136
}
135137
}
136138

tests/math.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ describe("math functions", () => {
4242
assert.deepEqual(nsf.powInt(uint(-inf, 0), 3), uint(-inf, 0));
4343
assert.deepEqual(nsf.powInt(uint(-2, 2), 3), uint(prev(-8), next(8)));
4444
assert.deepEqual(nsf.powInt(uint(1, 2), 3), uint(prev(1), next(8)));
45+
46+
assert.deepEqual(nsf.powInt(uint(5, 5), 0), uint(1, 1));
47+
assert.deepEqual(nsf.powInt(uint(-3, 5), 2), uint(0, next(25)));
48+
assert.deepEqual(nsf.powInt(uint(0, 5), 2), uint(0, next(25)));
49+
assert.deepEqual(nsf.powInt(uint(3, 5), 2), uint(prev(9), next(25)));
50+
assert.deepEqual(nsf.powInt(uint(-3, 1), 2), uint(0, next(9)));
4551
});
4652

4753
it("pow (interval/union)", () => {

0 commit comments

Comments
 (0)