summaryrefslogtreecommitdiff
path: root/library/src
diff options
context:
space:
mode:
authorHarmoGlace <23212967+HarmoGlace@users.noreply.github.com>2023-04-01 19:45:44 +0200
committerGitHub <noreply@github.com>2023-04-01 19:45:44 +0200
commitf94bc9a13fdcfbaf666188d434dcf481c46d8dfb (patch)
tree43b99fc9c592a1d31a12a3187f7cda74facd9ed2 /library/src
parent10a3fbd174fc1a3f95937c9120d478c8e94c277d (diff)
Fix zero power (#511)
Diffstat (limited to 'library/src')
-rw-r--r--library/src/compute/calc.rs19
1 files changed, 13 insertions, 6 deletions
diff --git a/library/src/compute/calc.rs b/library/src/compute/calc.rs
index bb5d9002..ba01c18e 100644
--- a/library/src/compute/calc.rs
+++ b/library/src/compute/calc.rs
@@ -90,19 +90,26 @@ pub fn pow(
/// The exponent of the power. Must be non-negative.
exponent: Spanned<Num>,
) -> Value {
- let exponent = match exponent.v {
+ let exponent_value = match exponent.v {
Num::Int(i) if i > u32::MAX as i64 => {
bail!(exponent.span, "exponent too large");
}
- Num::Int(i) if i != 0 => exponent.v,
- Num::Float(f) if f.is_normal() => exponent.v,
+ Num::Int(i) => exponent.v,
+ Num::Float(f) if f.is_normal() || f == 0 as f64 => exponent.v,
_ => {
- bail!(exponent.span, "exponent must be normal (non-zero, non-NaN, non-infinite, non-subnormal)");
+ bail!(
+ exponent.span,
+ "exponent must be normal (non-NaN, non-infinite, non-subnormal)"
+ );
}
};
- match (base, exponent) {
- (Num::Int(a), Num::Int(b)) if b > 0 => Value::Int(a.pow(b as u32)),
+ if exponent_value.float() == 0 as f64 && base.float() == 0 as f64 {
+ return bail!(exponent.span, "zero to the power of zero is undefined");
+ }
+
+ match (base, exponent_value) {
+ (Num::Int(a), Num::Int(b)) if b >= 0 => Value::Int(a.pow(b as u32)),
(a, Num::Int(b)) => Value::Float(a.float().powi(b as i32)),
(a, b) => Value::Float(f64::powf(a.float(), b.float())),
}