softfloat64/div_test.go
2024-04-16 20:05:25 +02:00

82 lines
1.4 KiB
Go

package softfloat64
import (
"math"
"math/rand/v2"
"strconv"
"testing"
)
func TestDiv(t *testing.T) {
t.Parallel()
base := []float64{
0,
math.Copysign(0, -1),
-1,
1,
math.NaN(),
math.Inf(+1),
math.Inf(-1),
0.1,
1.5,
1.9999999999999998, // all 1s mantissa
1.3333333333333333, // 1.010101010101...
1.1428571428571428, // 1.001001001001...
1.112536929253601e-308, // first normal
2,
4,
8,
16,
32,
64,
128,
256,
3,
12,
1234,
123456,
-0.1,
-1.5,
-1.9999999999999998,
-1.3333333333333333,
-1.1428571428571428,
-2,
-3,
1e-200,
1e-300,
1e-310,
5e-324,
1e-105,
1e-305,
1e+200,
1e+306,
1e+307,
1e+308,
}
all := make([]float64, 2000)
copy(all, base)
for i := len(base); i < len(all); i++ {
if i%2 == 0 {
all[i] = rand.NormFloat64()
} else {
all[i] = rand.ExpFloat64()
}
}
mode := RoundingModeToNearest
for i := range all {
for j := range all {
a := all[i] / all[j]
b := Div(all[i], all[j], mode)
if math.Float64bits(a) != math.Float64bits(b) {
t.Errorf("[%d+%d] Div(0x%016x (%s), 0x%016x (%s), %d) = 0x%016x (%s), want 0x%016x (%s)", i, j,
math.Float64bits(all[i]), strconv.FormatFloat(all[i], 'f', -1, 64),
math.Float64bits(all[j]), strconv.FormatFloat(all[j], 'f', -1, 64),
mode, math.Float64bits(b), strconv.FormatFloat(b, 'f', -1, 64),
math.Float64bits(a), strconv.FormatFloat(a, 'f', -1, 64),
)
}
}
}
}