Skip to content

Commit

Permalink
dec: fix setUint64 for _BD <= x <= 1<<_W
Browse files Browse the repository at this point in the history
  • Loading branch information
db47h committed May 8, 2020
1 parent d6ebbf0 commit 4282ec0
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 3 deletions.
5 changes: 2 additions & 3 deletions dec.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()

Expand Down
28 changes: 28 additions & 0 deletions dec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
})
}
}

0 comments on commit 4282ec0

Please sign in to comment.