diff options
author | mrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-12-12 17:02:24 +0000 |
---|---|---|
committer | mrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-12-12 17:02:24 +0000 |
commit | 7d3538db3fc8fb5890ed0f3ae19904cf05bb9d24 (patch) | |
tree | 257bf33fd9e8f97889f0624aaee0225dc6bb58c1 | |
parent | 27d53fb5dfd0928c1c6a7ff9f28a52cf0f55c96c (diff) | |
download | ruby-7d3538db3fc8fb5890ed0f3ae19904cf05bb9d24.tar.gz |
* ext/bigdecimal/bigdecimal.c (VpAddAbs): put out a conditional branch from
the inside of while-loop.
* ext/bigdecimal/bigdecimal.c (VpSubAbs): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44152 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | ext/bigdecimal/bigdecimal.c | 30 |
2 files changed, 22 insertions, 15 deletions
@@ -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 */ |