package float import ( "fmt" "math" "testing" ) func TestRound(t *testing.T) { negZero := math.Copysign(0, -1) testCases := []struct { in, out float64 }{ {-0.49999999999999994, negZero}, // -0.5+epsilon {-0.5, -1}, {-0.5000000000000001, -1}, // -0.5-epsilon {0, 0}, {0.49999999999999994, 0}, // 0.5-epsilon {0.5, 1}, {0.5000000000000001, 1}, // 0.5+epsilon {1.390671161567e-309, 0}, // denormal {2.2517998136852485e+15, 2.251799813685249e+15}, // 1 bit fraction {4.503599627370497e+15, 4.503599627370497e+15}, // large integer {math.Inf(-1), math.Inf(-1)}, {math.Inf(1), math.Inf(1)}, {math.NaN(), math.NaN()}, {negZero, negZero}, } for _, tc := range testCases { t.Run(fmt.Sprint(tc.in, tc.out), func(t *testing.T) { r := Round(tc.in) if math.Float64bits(r) != math.Float64bits(tc.out) { t.Errorf("got %v, want %v", r, tc.out) } }) } }