File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -1665,6 +1665,35 @@ mod tests {
16651665 ) ;
16661666 }
16671667
1668+ #[ test]
1669+ fn prevent_exploding_intervals ( ) {
1670+ let mut num = RealAlgebraicNumber :: from ( 2 ) / RealAlgebraicNumber :: from ( 3 ) ;
1671+ let original = num. clone ( ) ;
1672+
1673+ for _ in 0 ..100 {
1674+ num = num. pow ( ( 1 , 2 ) ) ;
1675+ num = num. pow ( ( 2 , 1 ) ) ;
1676+ }
1677+
1678+ assert_eq ! ( num, original) ;
1679+ assert_eq ! ( num. interval( ) . log2_denom( ) , 0 ) ;
1680+ assert_eq ! ( num. interval( ) . lower_bound_numer( ) , & BigInt :: from( 0 ) ) ;
1681+ assert_eq ! ( num. interval( ) . upper_bound_numer( ) , & BigInt :: from( 1 ) ) ;
1682+ }
1683+
1684+ #[ test]
1685+ fn prevent_exploding_precisions ( ) {
1686+ let v1 = -( RealAlgebraicNumber :: from ( 2 ) / RealAlgebraicNumber :: from ( 81 ) ) . pow ( ( 1 , 2 ) ) ;
1687+ let v2 = ( RealAlgebraicNumber :: from ( 200 ) / RealAlgebraicNumber :: from ( 81 ) ) . pow ( ( 1 , 2 ) ) ;
1688+
1689+ let num = v1 + v2;
1690+
1691+ assert_eq ! ( num, RealAlgebraicNumber :: from( 2 ) . pow( ( 1 , 2 ) ) ) ;
1692+ assert_eq ! ( num. interval( ) . log2_denom( ) , 0 ) ;
1693+ assert_eq ! ( num. interval( ) . lower_bound_numer( ) , & BigInt :: from( 1 ) ) ;
1694+ assert_eq ! ( num. interval( ) . upper_bound_numer( ) , & BigInt :: from( 2 ) ) ;
1695+ }
1696+
16681697 #[ test]
16691698 fn test_add ( ) {
16701699 fn test_case <
You can’t perform that action at this time.
0 commit comments