воскресенье, 20 декабря 2020 г.

Сравнение флотов (чисел с плавающей точкой) в NUnit

0.9999999999
vs
1.0000000001
У чисел с плавающей запятой (float, double) есть такая особенность, что из-за проблем потери точности, они могут получаться не равными, даже если должны быть такими с точки зрения математики. И это зависит не только от используемых операций, но и от архитектуры железа, а также флагов процессора, установленных в момент вычислений.
Например, 72/6 может быть не равно 3*4.
Но сравнивать их все равно нужно. Поэтому используется сравнение с определенной точностью. Берется модуль (абсолютное значение) разности этих чисел и сравнивается с небольшой константой. Если модуль разницы больше этой константы, числа считаются разными.
В библиотеке NUnit для таких сравнений есть специальные конструкции
Вместо велосипедов
Assert.IsTrue(Mathf.Abs(actualValue - expectedValue) < tolerance);
и
Assert.Less(Mathf.Abs(actualValue - expectedValue), tolerance);
В NUnit есть
Assert.AreEqual(expectedValue, actualValue, tolerance); 

Комментариев нет:

Отправить комментарий