82 lines
1.4 KiB
Go
82 lines
1.4 KiB
Go
package softfloat64
|
|
|
|
import (
|
|
"math"
|
|
"math/rand/v2"
|
|
"strconv"
|
|
"testing"
|
|
)
|
|
|
|
func TestAdd(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 := Add(all[i], all[j], mode)
|
|
if math.Float64bits(a) != math.Float64bits(b) {
|
|
t.Errorf("[%d+%d] Add(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),
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|