@@ -40,10 +40,10 @@ void bc_square_ex(bc_num n1, bc_num *result, size_t scale_min) {
4040 * (result ) = square_ex ;
4141}
4242
43- /* Raise NUM1 to the NUM2 power. The result is placed in RESULT.
44- Maximum exponent is LONG_MAX. If a NUM2 is not an integer,
43+ /* Raise "base" to the "exponent" power. The result is placed in RESULT.
44+ Maximum exponent is LONG_MAX. If a "exponent" is not an integer,
4545 only the integer part is used. */
46- void bc_raise (bc_num num1 , long exponent , bc_num * result , size_t scale ) {
46+ bool bc_raise (bc_num base , long exponent , bc_num * result , size_t scale ) {
4747 bc_num temp , power ;
4848 size_t rscale ;
4949 size_t pwrscale ;
@@ -54,7 +54,7 @@ void bc_raise(bc_num num1, long exponent, bc_num *result, size_t scale) {
5454 if (exponent == 0 ) {
5555 bc_free_num (result );
5656 * result = bc_copy_num (BCG (_one_ ));
57- return ;
57+ return true ;
5858 }
5959
6060 /* Other initializations. */
@@ -64,12 +64,12 @@ void bc_raise(bc_num num1, long exponent, bc_num *result, size_t scale) {
6464 rscale = scale ;
6565 } else {
6666 is_neg = false;
67- rscale = MIN (num1 -> n_scale * exponent , MAX (scale , num1 -> n_scale ));
67+ rscale = MIN (base -> n_scale * exponent , MAX (scale , base -> n_scale ));
6868 }
6969
7070 /* Set initial value of temp. */
71- power = bc_copy_num (num1 );
72- pwrscale = num1 -> n_scale ;
71+ power = bc_copy_num (base );
72+ pwrscale = base -> n_scale ;
7373 while ((exponent & 1 ) == 0 ) {
7474 pwrscale = 2 * pwrscale ;
7575 bc_square_ex (power , & power , pwrscale );
@@ -92,14 +92,19 @@ void bc_raise(bc_num num1, long exponent, bc_num *result, size_t scale) {
9292
9393 /* Assign the value. */
9494 if (is_neg ) {
95- bc_divide (BCG (_one_ ), temp , result , rscale );
95+ if (bc_divide (BCG (_one_ ), temp , result , rscale ) == false) {
96+ bc_free_num (& temp );
97+ bc_free_num (& power );
98+ return false;
99+ }
96100 bc_free_num (& temp );
97101 } else {
98102 bc_free_num (result );
99103 * result = temp ;
100104 (* result )-> n_scale = MIN (scale , (* result )-> n_scale );
101105 }
102106 bc_free_num (& power );
107+ return true;
103108}
104109
105110/* This is used internally by BCMath */
0 commit comments