2010-08-25 5 views
4

J'ai effectué le portage d'un projet C++ avec des tests gtest vers un projet C# ayant un test nunit. Maintenant, je rencontre des problèmes de précision en virgule flottante.Différence entre les doubles comparaisons dans gtest (C++) et nunit (C#)

dans le test de nunit je être pas ok (rouge)

Assert.AreEqual(0.7, 7 * 0.1); 

dans le test gtest je:

ASSERT_DOUBLE_EQ(0.7, 7 * 0.1); 

qui est ok (vert)

La question maintenant est POURQUOI ???

Répondre

1

Sinon, vous pouvez ajouter un troisième paramètre, qui est la différence maximale entre les deux valeurs, comme vous pouvez le lire here.

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

Vérifie que deux spécifié se double sont égaux, ou dans la précision spécifiée de l'autre. L'assertion échoue si elles ne sont pas dans les précision spécifiée de l'autre.

+0

La question restante est maintenant comment définir le delta de façon appropriée ... – schoetbi

2

ne jamais comparer les nombres à virgule flottante pour l'égalité! Les nombres fractionnaires décimaux (comme 0,1) ne peuvent pas être représentés dans des flottants de type Eee sans perte de précision minime. ce qui peut ressembler à 0.7 peut être 0.6999999 ou quelque chose d'autre en effet. ils sont des nombres différents alors. Vous devriez utiliser la technique epsilon: considérez a == b if abs(a - b) <= epsilon, où epsilon est un très petit nombre constant.

lisez ceci et bien d'autres^

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

What's wrong with using == to compare floats in Java?

+2

gtest et Nunit font cela. Mais il semble que ça se passe différemment. Je change le sujet du fil. – schoetbi

Questions connexes