Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static bool CompareAlmostEqual(float x, float y, float epsilon) {
- // Based upon implementation:
- // http://floating-point-gui.de/errors/comparison/
- if (x == y)
- return true;
- float absX = Math.Abs(x);
- float absY = Math.Abs(y);
- float diff = Math.Abs(x - y);
- if (x * y == 0)
- return diff < (epsilon * epsilon);
- else if (absX + absY == diff) // [1]
- return diff < epsilon;
- else
- return diff / (absX + absY) < epsilon;
- }
- // Without [1] the following test fail:
- [TestCase( 0.0001f, -0.0001f, 0.000001f )]
- [TestCase( 0.000000000001f, -0.000000000001f, 0.000001f )]
- // With [1] the following test still fails (as expected):
- [TestCase( 0.0001f, -0.0001f, 0.000001f )]
- // But this one passes:
- [TestCase( 0.000000000001f, -0.000000000001f, 0.000001f )]
- // The following tests are still failing:
- Assert.False(AlmostEqual(0.000000001f, -float.Epsilon));
- Failed: InvalidNumbersVeryCloseToZero(1E-09, -1.401298E-45)
- Assert.False(AlmostEqual(0.000000001f, float.Epsilon));
- Failed: InvalidNumbersVeryCloseToZero(1E-09, 1.401298E-45)
- Assert.False(AlmostEqual(float.Epsilon, 0.000000001f));
- Failed: InvalidNumbersVeryCloseToZero(1.401298E-45, 1E-09)
- Assert.False(AlmostEqual(-float.Epsilon, 0.000000001f));
- Failed: InvalidNumbersVeryCloseToZero(-1.401298E-45, 1E-09)
- Assert.False(AlmostEqual(1e25f * float.Epsilon, -1e25f * float.Epsilon, 1e-12f));
- Failed: InvalidNumbersVeryCloseToZeroCustomDelta(1.401298E-20, -1.401298E-20, 1E-12)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement