kämpfen wir seit einiger Zeit mit einem Unit-Test von mir. Während der Untersuchung haben wir die Grundursache gefunden, die anscheinend der Vergleich in Floats ist (siehe das folgende Code-Snippet, in dem ich die Berechnung vereinfacht habe, aber immer noch fehlschlägt).C++ Float-Vergleich um Null schlägt fehl Mit Gtest
TEST_F(MyFloatTest, thisOneDoesFail)
{
const float toCompare = 0.2f - 1.0f + 0.9f;
EXPECT_FLOAT_EQ(toCompare, 0.1f);
}
Das Ergebnis ist:
Aktuell: 0,1 Erwartet: toCompare Welche ist: 0,099999964
einige Hintergrundinformationen in der numerischen Mathematik zu haben, können wir immer noch nicht herausfinden, warum Dieser Test schlägt fehl, während ein benutzerdefinierter Float-Vergleich mit std :: numeric_limits :: epsilon bestanden wurde. Irgendwann begannen wir zu denken, dass GTest falsch ist und wir haben uns damit abgefunden. Es benutzt seltsame Ausdrücke, die wir nicht vollständig erfassen. Was ist noch seltsamer: Der folgende Test besteht, obwohl ich nur hinzufügen, 1:
TEST_F(MyFloatTest, thisOnePasses)
{
const float toCompare = 1.2f - 1.0f + 0.9f;
EXPECT_FLOAT_EQ(toCompare, 1.1f);
}
Wir dachten, es könnte ein Problem sein, wenn negative Float-Werte einschließlich, aber der nächste Test geht auch:
TEST_F(MyFloatTest, thisOnePassesAlso)
{
const float toCompare = 0.2f - 1.0f + 1.9f;
EXPECT_FLOAT_EQ(toCompare, 1.1f);
}
Also für uns scheint es als das EXPECT_FLOAT_EQ Makro von Gtest hat einfach ein Problem um Null. Kennt jemand dieses Verhalten? Haben Sie jemals ähnliche in Ihrer Umgebung gesehen? (Übrigens: wir verwenden den MSVC2015) Scheitert es aufgrund der in GTest genannten 4 ULP-Genauigkeit nur zufällig? (was uns auch nicht ganz klar ist).
[Dies] (http 0.125f gleich ist://stackoverflow.com/questions/588004/is-floating-point-math-broken?rq=1) könnte helfen – saloomi2012
Was ist mit dem EXPECT_FLOAT_EQ Makro? – gnasher729