ruby-changes:70477
From: Kenta <ko1@a...>
Date: Fri, 24 Dec 2021 02:30:05 +0900 (JST)
Subject: [ruby-changes:70477] 8ee8ac6423 (master): [ruby/bigdecimal] Fix trailing zeros handling in rb_uint64_convert_to_BigDecimal
https://git.ruby-lang.org/ruby.git/commit/?id=8ee8ac6423 From 8ee8ac64239626a9adea4e02ba3f0c4be4895e36 Mon Sep 17 00:00:00 2001 From: Kenta Murata <mrkn@m...> Date: Thu, 18 Nov 2021 10:59:12 +0900 Subject: [ruby/bigdecimal] Fix trailing zeros handling in rb_uint64_convert_to_BigDecimal Fix GH-192 https://github.com/ruby/bigdecimal/commit/eebc98b85a --- ext/bigdecimal/bigdecimal.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 8a107386a4a..7cec33b7c94 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -2862,21 +2862,29 @@ rb_uint64_convert_to_BigDecimal(uint64_t uval, RB_UNUSED_VAR(size_t digs), int r https://github.com/ruby/ruby/blob/trunk/ext/bigdecimal/bigdecimal.c#L2862 } else { DECDIG buf[BIGDECIMAL_INT64_MAX_LENGTH] = {0,}; - size_t exp = 0, ntz = 0; - for (; uval > 0; ++exp) { - DECDIG r = uval % BASE; - if (r == 0) ++ntz; - buf[BIGDECIMAL_INT64_MAX_LENGTH - exp - 1] = r; + DECDIG r = uval % BASE; + size_t len = 0, ntz = 0; + if (r == 0) { + // Count and skip trailing zeros + for (; r == 0 && uval > 0; ++ntz) { + uval /= BASE; + r = uval % BASE; + } + } + for (; uval > 0; ++len) { + // Store digits + buf[BIGDECIMAL_INT64_MAX_LENGTH - len - 1] = r; uval /= BASE; + r = uval % BASE; } - const size_t len = exp - ntz; + const size_t exp = len + ntz; vp = VpAllocReal(len); vp->MaxPrec = len; vp->Prec = len; vp->exponent = exp; VpSetSign(vp, 1); - MEMCPY(vp->frac, buf + BIGDECIMAL_INT64_MAX_LENGTH - exp, DECDIG, len); + MEMCPY(vp->frac, buf + BIGDECIMAL_INT64_MAX_LENGTH - len, DECDIG, len); } return BigDecimal_wrap_struct(obj, vp); -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/