Модульное тестирование не выполнено из-за неточности 0,000000001f - PullRequest
4 голосов
/ 28 мая 2009

Вектор отсутствует на 0,000000001f, поэтому тест не пройден.

Выполнение логики в моей голове приводит к -1.0f, -1.0f, но когда я написал код для прохождения теста (используя встроенные методы Vector), ответ возвращается как -0.999999999f, -0.999999999f, который по-прежнему 'право'.

Кстати, это C # (класс Vector2, предоставляемый платформой XNA), поэтому я попытался добавить значение epsilon для каждого параметра x и y в векторе, но это не сработало.

Я вижу это так: кодируя ответ, я пишу производственный код. Например. было бы то же самое. Конечно, это не правильно.

Любой совет?

Ответы [ 4 ]

6 голосов
/ 28 мая 2009

Фреймворки модульного тестирования обычно предоставляют утверждения для поплавков, которые принимают точность. Например, в Visual Studio Test вы можете написать:

Assert.AreEqual(1.0f, 0.9999999999f, 1e-3); // passes
Assert.AreEqual(1.0f, 0.9f, 1e-3); // fails
2 голосов
/ 28 мая 2009

Пожалуйста, смотрите мой ответ здесь .

Речь идет не о C #, но применяется та же логика.

1 голос
/ 28 мая 2009

Использование значения epsilon должно работать, вы можете опубликовать код, который не работает, чтобы прояснить вашу проблему. Вы должны сделать что-то вроде этого:

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

вместо

if (TestSomething()->Vector.x = 1.0f) return true;
0 голосов
/ 28 мая 2009

Числа с плавающей запятой могут иметь проблемы с точностью, кроме сравнения с 0, вы редко захотите сравнить два числа с плавающей запятой, используя ==.

Попытка добавить значение epsilon к векторам не сработает - вы все равно попадете в те же проблемы с точностью.

Вместо этого вам нужно увидеть, находится ли разница между ними ниже некоторого порога:

if (Math.Abs(x - y) < epsilon)
{
     // Equal!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...