Skip to content

Commit 61d9413

Browse files
authored
pow return early (#361)
1 parent d98c0d3 commit 61d9413

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

src/eval/semantics.cpp

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -49,40 +49,40 @@ Number Semantics::pow(const Number& base, const Number& exp) {
4949
if (base == Number::INF || exp == Number::INF) {
5050
return Number::INF;
5151
}
52+
if (base == Number::ONE) {
53+
return 1; // 1^x is always 1
54+
}
55+
if (base == -1) {
56+
return exp.odd() ? -1 : 1; // (-1)^x
57+
}
5258
if (base == Number::ZERO) {
5359
if (Number::ZERO < exp) {
5460
return 0; // 0^(positive number)
55-
} else if (exp == Number::ZERO) {
61+
}
62+
if (exp == Number::ZERO) {
5663
return 1; // 0^0
57-
} else {
58-
return Number::INF; // 0^(negative number)
5964
}
60-
} else if (base == Number::ONE) {
61-
return 1; // 1^x is always 1
62-
} else if (base == -1) {
63-
return exp.odd() ? -1 : 1; // (-1)^x
64-
} else {
65-
if (exp < Number::ZERO) {
66-
return 0;
67-
} else {
68-
Number r = 1;
69-
Number b = base;
70-
Number e = exp;
71-
while (r != Number::INF && e != Number::ZERO) {
72-
if (e.odd()) {
73-
r = mul(r, b);
74-
}
75-
e = div(e, 2);
76-
if (e != Number::ZERO) {
77-
b = mul(b, b);
78-
if (b == Number::INF) {
79-
r = Number::INF;
80-
}
81-
}
65+
return Number::INF; // 0^(negative number)
66+
}
67+
if (exp < Number::ZERO) {
68+
return 0;
69+
}
70+
Number r = 1;
71+
Number b = base;
72+
Number e = exp;
73+
while (r != Number::INF && e != Number::ZERO) {
74+
if (e.odd()) {
75+
r = mul(r, b);
76+
}
77+
e = div(e, 2);
78+
if (e != Number::ZERO) {
79+
b = mul(b, b);
80+
if (b == Number::INF) {
81+
r = Number::INF;
8282
}
83-
return r;
8483
}
8584
}
85+
return r;
8686
}
8787

8888
Number Semantics::gcd(const Number& a, const Number& b) {

0 commit comments

Comments
 (0)