Я тестирую несколько бит кода, число, которое включает вычисление с использованием значений с плавающей запятой - часто их очень много. У меня есть общий (C++ - templated, но это не имеет большого значения для этого вопроса) код, который сравнивает мои результаты, будь то скалярные или массивы, против их ожидаемых значений.Что такое хороший выбор метода сравнения чисел с плавающей запятой?
Я столкнулся с проблемой выбора прецизионного порога, по крайней мере для двух типов с плавающей запятой C/C++ float
и double
- для различных функций, которые я тестирую. Как и в случае well known, для сравнения значений с плавающей запятой нет единого размера, а не единственное значение точности, которое подходит и вычисляется, основываясь исключительно на типе данных: Относительная и абсолютная ошибка, многочисленные операции, которые могут увеличиваться ошибки округления с плавающей запятой, вычисления, которые должны быть равны 0, поэтому вы не можете нормализовать ожидаемое значение и т. д.
Что такое общепринятый подход/алгоритм/правило для большого пальца выбор метода сравнения (и порогов равенства) для значений с плавающей запятой?