Re: [Cppunit-devel] assertDoubleEquals, NaN & Microsoft Visual Studio 6
Brought to you by:
blep
From: CppUnit d. m. l. <cpp...@li...> - 2007-02-25 08:52:42
|
CppUnit development mailing list wrote: > Hi Baptiste, > > I'm unclear on what problem you are solving here. My guess is that > > CPPUNIT_ASSERT_DOUBLES_EQUAL( nan, nan, 1.0 ) > > was passing when it should in fact fail. Is that the case? Yes. I should have put this first. All the following unit tests were failing: CPPUNIT_ASSERT_ASSERTION_FAIL( CPPUNIT_ASSERT_DOUBLES_EQUAL( nan, 0.0, 1.0 ) ); CPPUNIT_ASSERT_ASSERTION_FAIL( CPPUNIT_ASSERT_DOUBLES_EQUAL( nan, nan, 1.0 ) ); CPPUNIT_ASSERT_ASSERTION_FAIL( CPPUNIT_ASSERT_DOUBLES_EQUAL( nan, inf, 1.0 ) ); CPPUNIT_ASSERT_ASSERTION_FAIL( CPPUNIT_ASSERT_DOUBLES_EQUAL( inf, nan, 1.0 ) ); This was caused by the fact that equal = expected == actual; always evaluated to true whenever expected or actual was a NaN. > Also: why did you make the following change in > examples/cppunittest/TestAssertTest.cpp? What does the comment mean? > > - CPPUNIT_ASSERT_ASSERTION_FAIL( CPPUNIT_ASSERT_DOUBLES_EQUAL( nan, > 0.0, 1.0 ) ); > + CPPUNIT_ASSERT_ASSERTION_FAIL( CPPUNIT_ASSERT_DOUBLES_EQUAL( nan, > 0.0, 1.0 ) ); // this one fails Ignore the comment, I forgot to remove it. It's done now. I hope it's clearer now. Baptiste. > Quoting CppUnit development mailing list > <cpp...@li...>: > >> This seems to confirm that MSVC6 code generator is bug (does not >> respect IEEE-754 standard in spite of what the doc claim). >> >> To work-around this, I added an explicit test for NaN value when >> testing non-finite value for equalities. Here is the function: >> // To work around this, a NaN is assumed to be detected if no strict >> ordering is found. >> inline bool floatingPointIsUnordered( double x ) >> { >> // x != x will detect a NaN on conformant platform >> // (2.0 < x && x < 1.0) will detect a NaN on non conformant >> platform: // => no ordering can be found for x. >> return (x != x) || (2.0 < x && x < 1.0); >> } > > I don't understand why this works for you. According to the standard > (see e.g. page 8 of > http://www.cs.berkeley.edu/~wkahan/ieee754status/ieee754.ps) all > comparisons with NaN are false except "x != x", which is true. You > state that MSVC6 gets "x != x" wrong. Does it also get "x < y" wrong > and return true? > > >> I'm not an expert on floating-point manipulation & NaN. Does any one >> see anything wrong on the above implementation or the comments? > > The section of the paper referenced above also states that all > comparisons with NaN, except == and !=, are *invalid* and thus signal. > So the code you wrote is going to cause a problem if the FPU signals > are enabled. > > > If we need this function, can we rename it floatingPointIsNan()? Then > I can create suitable automakery to use the standard isnan() on > systems that have it. On that note, does MSVC6 have something like > isnan(), maybe called _isnan()? > http://msdn2.microsoft.com/en-us/library/tzthab44(VS.80).aspx > > > Cheers, > -Steve > > > > ------------------------------------------------------------------------- > Take Surveys. Earn Cash. Influence the Future of IT > Join SourceForge.net's Techsay panel and you'll get the chance to > share your opinions on IT & business topics through brief surveys-and > earn cash > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV > _______________________________________________ > Cppunit-devel mailing list > Cpp...@li... > https://lists.sourceforge.net/lists/listinfo/cppunit-devel |