views:

47

answers:

3

I have done porting of a c++ project with gtest tests to a c# project having an nunit test. Now I encounter problems with floating point precision.

in the nunit test I have being not ok (red)

Assert.AreEqual(0.7, 7 * 0.1); 

in the gtest test I have:

ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);

which is ok (green)

The question now is WHY???

A: 

never-ever compare floating point numbers for equality! decimal fractional numbers (like 0.1) can't be represented into ieee floats without small precision lost. what may look like 0.7 may be 0.6999999 or something else indeed. they are different numbers then. You should use epsilon technique: consider a == b if abs(a - b) <= epsilon , where epsilon is very small constant number.

read this and many others^

http://docs.sun.com/source/806-3568/ncg_goldberg.html

http://stackoverflow.com/questions/1088216/whats-wrong-with-using-to-compare-floats-in-java

Andrey
gtest and nunit are doing that. But it seems that it is handeled differently. I change the topic of the thread.
schoetbi
A: 

Alternatively you can add a third parameter, which is the maximum difference between the two values, as you can read here.

public static void AreEqual (
    double expected,
    double actual,
    double delta
)

Verifies that two specified doubles are equal, or within the specified accuracy of each other. The assertion fails if they are not within the specified accuracy of each other.

Exa
The remaining question now is how to set the delta appropriatelly...
schoetbi
A: 

Try Assert.AreApproximatelyEqual when comparing floats instead.

Douglas