floating-point-gui.de
floating-point-gui.de copied to clipboard
Potentialy erroneous test case?
Hi!
I'm currently porting your nearlyEqual-implementation and test cases to C++. Hoping to send you the results in a day or two.
However, one of the test cases fails and I'm wondering if it might in fact be an erroneous test case?
/** Comparisons of numbers on opposite sides of 0 */
@Test
public void opposite() {
assertFalse(nearlyEqual(1.000000001f, -1.0f));
assertFalse(nearlyEqual(-1.0f, 1.000000001f));
assertFalse(nearlyEqual(-1.000000001f, 1.0f));
assertFalse(nearlyEqual(1.0f, -1.000000001f));
assertTrue(nearlyEqual(10 * Float.MIN_VALUE, 10 * -Float.MIN_VALUE)); //<-- inverted assert?
assertFalse(nearlyEqual(10000 * Float.MIN_VALUE, 10000 * -Float.MIN_VALUE));
}
The second to last test; nearlyEqual(10 * MIN_VALUE, 10 * -MIN_VALUE)
, evaluates to false
for me. Is there something weird going on in my end, or should that test actually be assertFalse
?
My Google Test case for reference:
TEST(NearlyEqual, opposite) {
static constexpr auto MIN = std::numeric_limits<float>::min();
EXPECT_FALSE(nearly_equal(1.000000001f, -1.0f));
EXPECT_FALSE(nearly_equal(-1.0f, 1.000000001f));
EXPECT_FALSE(nearly_equal(-1.000000001f, 1.0f));
EXPECT_FALSE(nearly_equal(1.0f, -1.000000001f));
EXPECT_TRUE(nearly_equal(10.0f * MIN, 10.0f * -MIN)); //this fails for me
EXPECT_FALSE(nearly_equal(10000.0f * MIN, 10000.0f * -MIN));
}
I am using the same epsilon (0.00001f
) as you, and I'm not compiling with the fast floating point flag.
There is probably something more going on. All the ulp tests fail as well. Am I missunderstanding what Java's Float.MIN_VALUE
represents?
TEST(NearlyEqualTest, ulp) {
static constexpr auto MIN = std::numeric_limits<float>::min();
EXPECT_TRUE(nearly_equal(MIN, MIN)); //pass
EXPECT_TRUE(nearly_equal(MIN, -MIN)); //fail
EXPECT_TRUE(nearly_equal(-MIN, MIN)); //fail
EXPECT_TRUE(nearly_equal(MIN, 0.0f)); //fail
EXPECT_TRUE(nearly_equal(0.0f, MIN)); //fail
EXPECT_TRUE(nearly_equal(-MIN, 0.0f)); //fail
EXPECT_TRUE(nearly_equal(0.0f, -MIN)); //fail
EXPECT_FALSE(nearly_equal(0.000000001f, -MIN)); //pass
EXPECT_FALSE(nearly_equal(0.000000001f, MIN)); //pass
EXPECT_FALSE(nearly_equal(MIN, 0.000000001f)); //pass
EXPECT_FALSE(nearly_equal(-MIN, 0.000000001f)); //pass
//sanity check:
EXPECT_FLOAT_EQ(MIN, -MIN); //fail: 1.1754944e-38 != -1.1754944e-38
}