@@ -40,10 +40,10 @@ void bc_square_ex(bc_num n1, bc_num *result, size_t scale_min) {
40
40
* (result ) = square_ex ;
41
41
}
42
42
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,
45
45
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 ) {
47
47
bc_num temp , power ;
48
48
size_t rscale ;
49
49
size_t pwrscale ;
@@ -54,7 +54,7 @@ void bc_raise(bc_num num1, long exponent, bc_num *result, size_t scale) {
54
54
if (exponent == 0 ) {
55
55
bc_free_num (result );
56
56
* result = bc_copy_num (BCG (_one_ ));
57
- return ;
57
+ return true ;
58
58
}
59
59
60
60
/* Other initializations. */
@@ -64,12 +64,12 @@ void bc_raise(bc_num num1, long exponent, bc_num *result, size_t scale) {
64
64
rscale = scale ;
65
65
} else {
66
66
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 ));
68
68
}
69
69
70
70
/* 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 ;
73
73
while ((exponent & 1 ) == 0 ) {
74
74
pwrscale = 2 * pwrscale ;
75
75
bc_square_ex (power , & power , pwrscale );
@@ -92,14 +92,19 @@ void bc_raise(bc_num num1, long exponent, bc_num *result, size_t scale) {
92
92
93
93
/* Assign the value. */
94
94
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
+ }
96
100
bc_free_num (& temp );
97
101
} else {
98
102
bc_free_num (result );
99
103
* result = temp ;
100
104
(* result )-> n_scale = MIN (scale , (* result )-> n_scale );
101
105
}
102
106
bc_free_num (& power );
107
+ return true;
103
108
}
104
109
105
110
/* This is used internally by BCMath */
0 commit comments