From 4282ec064a7ea0637d05f7b5050bcef8c9004b68 Mon Sep 17 00:00:00 2001 From: Denis Bernard Date: Thu, 7 May 2020 13:11:09 +0200 Subject: [PATCH] dec: fix setUint64 for _BD <= x <= 1<<_W --- dec.go | 5 ++--- dec_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/dec.go b/dec.go index 4dffd86..dd3fcec 100644 --- a/dec.go +++ b/dec.go @@ -107,12 +107,12 @@ func (z dec) setWord(x Word) dec { func (z dec) setUint64(x uint64) (dec, int32) { dig := int32(decDigits64(x)) - if w := Word(x); uint64(w) == x { + if w := Word(x); uint64(w) == x && w < _BD { return z.setWord(w), dig } // x could be a 2 to 3 words value z = z.make(int(dig+_WD-1) / _WD) - for i := 0; i < len(z) && x != 0; i++ { + for i := 0; i < len(z); i++ { hi, lo := bits.Div64(0, x, _BD) z[i] = Word(lo) x = hi @@ -237,7 +237,6 @@ func (z dec) shl(x dec, s uint) dec { n := m + int(s/_WD) z = z.make(n + 1) - // TODO(db47h): optimize and bench shifts when s%_WD == 0 z[n] = shl10VU(z[n-m:n], x, s%_WD) z[0 : n-m].clear() diff --git a/dec_test.go b/dec_test.go index 3dde952..ce82d08 100644 --- a/dec_test.go +++ b/dec_test.go @@ -49,3 +49,31 @@ func TestDec_digit(t *testing.T) { }) } } + +func TestDecSetUint64(t *testing.T) { + data := []struct { + in uint64 + exp int32 + }{ + {_BD + 1, int32(_WD + 1)}, + {_BD - 1, int32(_WD)}, + {9999, 4}, + } + var z dec + for _, d := range data { + out := fmt.Sprintf("%d", d.in) + t.Run(out, func(t *testing.T) { + var exp int32 + z, exp = z.setUint64(d.in) + if a := string(z.utoa(10)); a != out { + t.Fatalf("expected mantissa %v, got %v", out, a) + } + if exp != d.exp { + t.Fatalf("expected exponent %v, got %v", d.exp, exp) + } + if l := (exp + _WD - 1) / _WD; l != int32(len(z)) { + t.Fatalf("expected length %v, got %v", l, len(z)) + } + }) + } +}