Commit 6d5ebc70 authored by erifan01's avatar erifan01 Committed by Robert Griesemer

math: add a testcase for Mod and Remainder respectively

One might try to implement the Mod or Remainder function with the expression
x - TRUNC(x/y + 0.5)*y, but in fact this method is wrong, because the rounding
of (x/y + 0.5) to initialize the argument of TRUNC may lose too much precision.
However, the current test cases can not detect this error. This CL adds two
test cases to prevent people from continuing to do such attempts.

Change-Id: I6690f5cffb21bf8ae06a314b7a45cafff8bcee13
Reviewed-on: https://go-review.googlesource.com/84275Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent a2ffe3e6
......@@ -2435,6 +2435,10 @@ func TestMod(t *testing.T) {
t.Errorf("Mod(%g, %g) = %g, want %g", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i])
}
}
// verify precision of result for extreme inputs
if f := Mod(5.9790119248836734e+200, 1.1258465975523544); 0.6447968302508578 != f {
t.Errorf("Remainder(5.9790119248836734e+200, 1.1258465975523544) = %g, want 0.6447968302508578", f)
}
}
func TestFrexp(t *testing.T) {
......@@ -2776,6 +2780,10 @@ func TestRemainder(t *testing.T) {
t.Errorf("Remainder(%g, %g) = %g, want %g", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i])
}
}
// verify precision of result for extreme inputs
if f := Remainder(5.9790119248836734e+200, 1.1258465975523544); -0.4810497673014966 != f {
t.Errorf("Remainder(5.9790119248836734e+200, 1.1258465975523544) = %g, want -0.4810497673014966", f)
}
}
func TestRound(t *testing.T) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment