diff --git a/dec_arith_test.go b/dec_arith_test.go new file mode 100644 index 0000000..9a3a597 --- /dev/null +++ b/dec_arith_test.go @@ -0,0 +1,59 @@ +package decimal + +import ( + "math/rand" + "reflect" + "strconv" + "testing" + "time" +) + +func TestAdd10VW(t *testing.T) { + td := []struct { + i dec + x Word + o dec + c Word + s int64 + }{ + {dec{_BD - 2, _BD - 1}, 2, dec{}, 1, 0}, + {dec{_BD - 2, _BD - 1}, 1, dec{_BD - 1, _BD - 1}, 0, 0}, + {dec{_BD - 2, _BD - 2}, 2, dec{0, _BD - 1}, 0, 0}, + } + for i, d := range td { + t.Run(strconv.Itoa(i), func(t *testing.T) { + z := d.i + c := add10VW(z, z, d.x) + var s int64 + z = z.norm() + if len(z) > 0 { + s = dnorm(z) + } + if !reflect.DeepEqual(z, d.o) || s != d.s || c != d.c { + t.Fatalf("addW failed: expected z = %v, s = %d, c = %d, got d = %v, s = %v, c = %v", d.o, d.s, d.c, z, s, c) + } + + }) + } +} + +func TestDecDigits(t *testing.T) { + rand.Seed(time.Now().UnixNano()) + for i := 0; i < 10000; i++ { + n := uint(rand.Uint64()) + d := uint(0) + for m := n; m != 0; m /= 10 { + d++ + } + if dd := decDigits(n); dd != d { + t.Fatalf("decDigits(%d) = %d, expected %d", n, dd, d) + } + } +} + +func BenchmarkDecDigits(b *testing.B) { + rand.Seed(0xdeadbeefbadf00d) + for i := 0; i < b.N; i++ { + benchU = decDigits(uint(rand.Uint64()) % _BD) + } +} diff --git a/dec_conv.go b/dec_conv.go index 423848e..323bd9b 100644 --- a/dec_conv.go +++ b/dec_conv.go @@ -98,7 +98,7 @@ func (z dec) scan(r io.ByteScanner, base int, fracOk bool) (res dec, b, count in d1 = MaxBase + 1 } if d1 >= b1 { - r.UnreadByte() // ch does not belong to number anymore + err = r.UnreadByte() // ch does not belong to number anymore break } prev = '0' diff --git a/dec_test.go b/dec_test.go index cf88abe..5e8d30d 100644 --- a/dec_test.go +++ b/dec_test.go @@ -3,7 +3,6 @@ package decimal import ( "math/bits" "math/rand" - "reflect" "strconv" "testing" "time" @@ -28,58 +27,6 @@ func TestDec_ntz(t *testing.T) { } } -func Test_mag(t *testing.T) { - rand.Seed(time.Now().UnixNano()) - for i := 0; i < 10000; i++ { - n := uint(rand.Uint64()) - d := uint(0) - for m := n; m != 0; m /= 10 { - d++ - } - if dd := decDigits(n); dd != d { - t.Fatalf("mag(%d) = %d, expected %d", n, dd, d) - } - } -} - -// TODO(db47h): remove this function -func Test_dec_setInt(t *testing.T) { - // // TODO(db47h): next step - // b, _ := new(big.Int).SetString("12345678901234567890", 0) - // d, exp := dec{}.make(3).setInt(b) - // t.Log(d, exp) - // t.Log(string(dtoa(d, 10))) -} - -func Test_add10VW(t *testing.T) { - td := []struct { - i dec - x Word - o dec - c Word - s int64 - }{ - {dec{_BD - 2, _BD - 1}, 2, dec{}, 1, 0}, - {dec{_BD - 2, _BD - 1}, 1, dec{_BD - 1, _BD - 1}, 0, 0}, - {dec{_BD - 2, _BD - 2}, 2, dec{0, _BD - 1}, 0, 0}, - } - for i, d := range td { - t.Run(strconv.Itoa(i), func(t *testing.T) { - z := d.i - c := add10VW(z, z, d.x) - var s int64 - z = z.norm() - if len(z) > 0 { - s = dnorm(z) - } - if !reflect.DeepEqual(z, d.o) || s != d.s || c != d.c { - t.Fatalf("addW failed: expected z = %v, s = %d, c = %d, got d = %v, s = %v, c = %v", d.o, d.s, d.c, z, s, c) - } - - }) - } -} - func TestDec_digit(t *testing.T) { data := []struct { d dec @@ -107,27 +54,7 @@ var ( benchU uint ) -// func Benchmark_dnorm(b *testing.B) { -// rand.Seed(0xdeadbeefbadf00d) -// d := dec{}.make(10000) -// for i := range d { -// d[i] = Word(rand.Uint64()) % _BD -// } -// for i := 0; i < b.N; i++ { -// d[0] = Word(rand.Uint64()) % _BD -// d[len(d)-1] = Word(rand.Uint64()) % _BD -// benchD, benchU = d.dnorm() -// } -// } - -func Benchmark_mag(b *testing.B) { - rand.Seed(0xdeadbeefbadf00d) - for i := 0; i < b.N; i++ { - benchU = decDigits(uint(rand.Uint64()) % _BD) - } -} - -func Benchmark_dec_Digits(b *testing.B) { +func BenchmarkDec_Digits(b *testing.B) { rand.Seed(0xdeadbeefbadf00d) d := dec{}.make(10000) for i := range d { diff --git a/decimal_test.go b/decimal_test.go index 361718a..53e0377 100644 --- a/decimal_test.go +++ b/decimal_test.go @@ -91,3 +91,16 @@ func TestDecimal_SetString(t *testing.T) { // }) // } } + +func BenchmarkDnorm(b *testing.B) { + rand.Seed(0xdeadbeefbadf00d) + d := dec{}.make(1000) + for i := range d { + d[i] = Word(rand.Uint64()) % _BD + } + for i := 0; i < b.N; i++ { + d[0] = Word(rand.Uint64()) % _BD + d[len(d)-1] = Word(rand.Uint64()) % _BD + benchU = uint(dnorm(d)) + } +}