Skip to content

Commit 320699c

Browse files
authored
Fix large exponent parity (#152)
1 parent 701da41 commit 320699c

1 file changed

Lines changed: 26 additions & 4 deletions

File tree

src/number.rs

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,10 +268,19 @@ impl Number {
268268

269269
match (self, rhs) {
270270
(Self::Exact(lhs), Self::Exact(exponent)) => {
271-
if exponent.is_integer()
272-
&& let Some(exponent) = exponent.numer().to_i32()
273-
{
274-
return Ok(Self::Exact(lhs.clone().pow(exponent)));
271+
if exponent.is_integer() {
272+
if let Some(exponent) = exponent.numer().to_i32() {
273+
return Ok(Self::Exact(lhs.clone().pow(exponent)));
274+
}
275+
276+
return Ok(Self::Approx(
277+
Float::with_val_round(
278+
config.precision(),
279+
self.to_float(config).pow(exponent.numer()),
280+
config.rounding_mode,
281+
)
282+
.0,
283+
));
275284
}
276285

277286
Ok(self.approx_pow(rhs, config))
@@ -843,6 +852,19 @@ mod tests {
843852
case(Round::Up, false);
844853
}
845854

855+
#[test]
856+
fn power_preserves_large_exact_exponent() {
857+
let config = Config {
858+
precision: 2,
859+
..Config::default()
860+
};
861+
862+
assert_eq!(
863+
Number::from(-1_i64).pow(&Number::from(2_147_483_649_i64), config),
864+
Ok(Number::Approx(Float::with_val(2, -1)))
865+
);
866+
}
867+
846868
#[test]
847869
fn undefined_exact_arithmetic_returns_error() {
848870
let zero = Number::from(0_i64);

0 commit comments

Comments
 (0)