summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ext/bigdecimal/bigdecimal.c30
2 files changed, 22 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index fafa3b8e26..924a218a8c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Dec 13 01:56:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (VpAddAbs): put out a conditional branch from
+ the inside of while-loop.
+
+ * ext/bigdecimal/bigdecimal.c (VpSubAbs): ditto.
+
Wed Dec 13 01:53:00 2013 Kenta Murata <mrkn@mrkn.jp>
* ext/bigdecimal/bigdecimal.c (VPrint): be a static function, support another
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 1eef609b95..266983c785 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -4196,14 +4196,14 @@ VpAddAbs(Real *a, Real *b, Real *c)
/* Just assign the last few digits of b to c because a has no */
/* corresponding digits to be added. */
- while (b_pos + word_shift > a_pos) {
- --c_pos;
- if (b_pos > 0) {
- c->frac[c_pos] = b->frac[--b_pos];
+ if (b_pos > 0) {
+ while (b_pos > 0 && b_pos + word_shift > a_pos) {
+ c->frac[--c_pos] = b->frac[--b_pos];
}
- else {
- --word_shift;
- c->frac[c_pos] = 0;
+ }
+ if (b_pos == 0 && word_shift > a_pos) {
+ while (word_shift-- > a_pos) {
+ c->frac[--c_pos] = 0;
}
}
@@ -4299,16 +4299,16 @@ VpSubAbs(Real *a, Real *b, Real *c)
/* each of the last few digits of the b because the a has no */
/* corresponding digits to be subtracted. */
if (b_pos + word_shift > a_pos) {
- while (b_pos + word_shift > a_pos) {
- --c_pos;
- if (b_pos > 0) {
- c->frac[c_pos] = BASE - b->frac[--b_pos] - borrow;
- }
- else {
+ while (b_pos > 0 && b_pos + word_shift > a_pos) {
+ c->frac[--c_pos] = BASE - b->frac[--b_pos] - borrow;
+ borrow = 1;
+ }
+ if (b_pos == 0) {
+ while (word_shift > a_pos) {
--word_shift;
- c->frac[c_pos] = BASE - borrow;
+ c->frac[--c_pos] = BASE - borrow;
+ borrow = 1;
}
- borrow = 1;
}
}
/* Just assign the last few digits of a to c because b has no */