mirror of
https://github.com/golang/go
synced 2024-11-18 16:04:44 -07:00
math/big: add "smoke test" for big.Float division
Change-Id: Ica419a1215ca33dc1cff1e9e4137f204591e3cee Reviewed-on: https://go-review.googlesource.com/3942 Reviewed-by: Alan Donovan <adonovan@google.com>
This commit is contained in:
parent
91c0f006fc
commit
f083a0e364
@ -521,6 +521,47 @@ func TestFloatQuo(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestFloatQuoSmoke tests all divisions x/y for values x, y in the range [-n, +n];
|
||||
// it serves as a smoke test for basic correctness of division.
|
||||
func TestFloatQuoSmoke(t *testing.T) {
|
||||
n := 1000
|
||||
if testing.Short() {
|
||||
n = 10
|
||||
}
|
||||
|
||||
const dprec = 3 // max. precision variation
|
||||
const prec = 10 + dprec // enough bits to hold n precisely
|
||||
for x := -n; x <= n; x++ {
|
||||
for y := -n; y < n; y++ {
|
||||
if y == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
a := float64(x)
|
||||
b := float64(y)
|
||||
c := a / b
|
||||
|
||||
// vary operand precision (only ok as long as a, b can be represented correctly)
|
||||
for ad := -dprec; ad <= dprec; ad++ {
|
||||
for bd := -dprec; bd <= dprec; bd++ {
|
||||
A := NewFloat(a, uint(prec+ad), 0)
|
||||
B := NewFloat(b, uint(prec+bd), 0)
|
||||
C := NewFloat(0, 53, 0).Quo(A, B) // C has float64 mantissa width
|
||||
|
||||
cc, acc := C.Float64()
|
||||
if cc != c {
|
||||
t.Errorf("%g/%g = %s; want %.5g\n", a, b, C.Format('g', 5), c)
|
||||
continue
|
||||
}
|
||||
if acc != Exact {
|
||||
t.Errorf("%g/%g got %s result; want exact result", a, b, acc)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// normBits returns the normalized bits for x: It
|
||||
// removes multiple equal entries by treating them
|
||||
// as an addition (e.g., []int{5, 5} => []int{6}),
|
||||
|
Loading…
Reference in New Issue
Block a user