|
39 | 39 | #define SIGNED_VALUE_MIN INTPTR_MIN |
40 | 40 | #define MUL_OVERFLOW_SIGNED_VALUE_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, SIGNED_VALUE_MIN, SIGNED_VALUE_MAX) |
41 | 41 |
|
| 42 | +/* max_value = 0.9999_9999_9999E[exponent], exponent <= SIGNED_VALUE_MAX */ |
| 43 | +#define VP_EXPONENT_MAX (SIGNED_VALUE_MAX / BASE_FIG) |
| 44 | +/* min_value = 0.0001_0000_0000E[exponent], exponent-(BASE_FIG-1) >= SIGNED_VALUE_MIN */ |
| 45 | +#define VP_EXPONENT_MIN ((SIGNED_VALUE_MIN + BASE_FIG - 1) / BASE_FIG) |
| 46 | + |
42 | 47 | VALUE rb_cBigDecimal; |
43 | 48 | VALUE rb_mBigMath; |
44 | 49 |
|
@@ -5084,24 +5089,14 @@ AddExponent(Real *a, SIGNED_VALUE n) |
5084 | 5089 | { |
5085 | 5090 | SIGNED_VALUE e = a->exponent; |
5086 | 5091 | SIGNED_VALUE m = e+n; |
5087 | | - SIGNED_VALUE eb, mb; |
5088 | | - if (e > 0) { |
5089 | | - if (n > 0) { |
5090 | | - if (MUL_OVERFLOW_SIGNED_VALUE_P(m, (SIGNED_VALUE)BASE_FIG) || |
5091 | | - MUL_OVERFLOW_SIGNED_VALUE_P(e, (SIGNED_VALUE)BASE_FIG)) |
5092 | | - goto overflow; |
5093 | | - mb = m*(SIGNED_VALUE)BASE_FIG; |
5094 | | - eb = e*(SIGNED_VALUE)BASE_FIG; |
5095 | | - if (eb - mb > 0) goto overflow; |
5096 | | - } |
5097 | | - } |
5098 | | - else if (n < 0) { |
5099 | | - if (MUL_OVERFLOW_SIGNED_VALUE_P(m, (SIGNED_VALUE)BASE_FIG) || |
5100 | | - MUL_OVERFLOW_SIGNED_VALUE_P(e, (SIGNED_VALUE)BASE_FIG)) |
5101 | | - goto underflow; |
5102 | | - mb = m*(SIGNED_VALUE)BASE_FIG; |
5103 | | - eb = e*(SIGNED_VALUE)BASE_FIG; |
5104 | | - if (mb - eb > 0) goto underflow; |
| 5092 | + if (e > 0 && n > 0) { |
| 5093 | + if (n > VP_EXPONENT_MAX - e) goto overflow; |
| 5094 | + } else if (e < 0 && n < 0) { |
| 5095 | + if (n < VP_EXPONENT_MIN - e) goto underflow; |
| 5096 | + } else if (m > VP_EXPONENT_MAX) { |
| 5097 | + goto overflow; |
| 5098 | + } else if (m < VP_EXPONENT_MIN) { |
| 5099 | + goto underflow; |
5105 | 5100 | } |
5106 | 5101 | a->exponent = m; |
5107 | 5102 | return 1; |
|
0 commit comments