2009-05-27 14 views
4

Un vecteur est dépassé de 0,000000001f, le test échoue donc. Faire la logique dans ma tête donne -1.0f, -1.0f mais quand j'ai écrit le code pour passer le test (en utilisant les méthodes intégrées Vector) la réponse revient comme -0.999999999f, -0.999999999f qui est toujours 'juste'. D'ailleurs, il s'agit de C# (classe Vector2 fournie par le framework XNA), donc j'ai essayé d'ajouter une valeur epsilon à chaque paramètre x et y du Vector mais cela n'a pas fonctionné. La façon dont je le vois est qu'en codant la réponse, j'écris le code de production. Par exemple. ce serait pareil. Sûrement ce n'est pas le bon.Échec du test unitaire en raison d'une erreur de 0,000000001f

Un conseil?

Répondre

2

Veuillez voir ma réponse here.

Il ne s'agit pas de C#, mais la même logique s'applique.

0

Les nombres à virgule flottante peuvent présenter des problèmes de précision, en plus de la comparaison à 0, vous voudrez rarement comparer deux nombres à virgule flottante en utilisant ==.

Si vous tentez d'ajouter une valeur epsilon aux vecteurs, cela ne fonctionnera pas - vous rencontrerez toujours les mêmes problèmes de précision.

Au lieu de cela, vous devez voir si la différence entre les deux est inférieur à un certain seuil:

if (Math.Abs(x - y) < epsilon) 
{ 
    // Equal! 
} 
1

En utilisant une valeur epsilon devrait fonctionner, vous pouvez afficher le code qui ne fonctionne pas pour rendre votre problème plus clair . Vous devriez faire quelque chose comme ceci:

if ((TestSomething()->Vector.x - 1.0f) <= EPSILON) return true; 

au lieu de

if (TestSomething()->Vector.x = 1.0f) return true; 
+0

Vous avez oublié le Math.Abs ​​() autour de la différence. – Cheeso

6

cadres tests unitaires fournissent affirme pour les flotteurs qui prennent une précision. Par exemple dans Visual Studio Test vous pouvez écrire:

Assert.AreEqual(1.0f, 0.9999999999f, 1e-3); // passes 
Assert.AreEqual(1.0f, 0.9f, 1e-3); // fails 
+0

Son NUnit. Le code n'est pas accessible pour le moment. Est-ce que quelqu'un sait si NUnit a quelque chose de similaire? – Finglas

+1

Oui, NUnit a le même concept: http://www.nunit.org/index.php?p=equalityAsserts&r=2.2.7 –

+0

Bravo, c'est une aide précieuse. – Finglas

Questions connexes