File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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 ) ;
You can’t perform that action at this time.
0 commit comments