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), ) } } } }