![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Theory behind floating point comparisonsBoost , Boost.Test , Floating point comparison
|
![]() |
Note |
---|---|
Обратите внимание, что как арифметические, так и неарифметические операции могут также приводить к другим «неокругляющим» ошибкам, таким как отток/переток, деление на ноль или «ошибки операции». |
Все теоремы о верхнем пределе ошибки округления, включая теорему half_epsilon
, относятся только к операции округления. Это означает, что «ошибка операции», то есть ошибка, допущенная самой операцией, помимо округления, не учитывается. Для того чтобы численное программное обеспечение могло фактически предсказывать границы ошибок, стандарт IEEE754 требует, чтобы арифметические операции были «правильно или точно округлены». То есть требуется, чтобы внутреннее вычисление данной операции было таким, чтобы результат с плавающей точкой был точным результатом, округленным до числа рабочих битов. Другими словами, требуется, чтобы вычисления, используемые самой операцией, не вводили никаких дополнительных ошибок. Стандарт IEEE754 не требует такого же поведения от большинства неарифметических операций. Ошибки оттока/перетока и деления на ноль могут привести к ошибкам округления с непредсказуемыми верхними границами.
Имейте в виду, что правила half_epsilon
не являются транзитивными. Другими словами, комбинация двух арифметических операций может привести к ошибке округления, которая значительно превышает 2*half_epsilon
. В целом, нет общих правил о том, как выбрать толерантность, и пользователи должны применять здравый смысл и конкретные знания о предмете / проблеме, чтобы решить ценность толерантности.
Для упрощения в большинстве случаев использования последняя версия алгоритма, приведенная ниже, решила использовать процентные значения для спецификации толерантности (вместо долей связанных значений). Другими словами, теперь вы используете его, чтобы проверить, что разница между двумя значениями не превышает х процентов.
Для получения дополнительной информации о сравнении с плавающей точкой см. ссылки ниже.
Books
Donald. E. Knuth, 1998, Addison-Wesley Longman, Inc., ISBN 0-201-89684-2, Addison-Wesley Professional; 3rd edition. (Соответствующие уравнения приведены в §4.2.2, Eq. 36 и 37.)
Ulrich W. Kulisch, 2002, Springer, Inc., ISBN 0-201-89684-2, Springer; 1-е издание
Periodicals
Alberto Squassabia, C++ Report (март 2000)
Пит Беккер, C/C++ Users Journal (декабрь 2000)
Publications
David Goldberg, pages 150-230, in Computing Surveys (March 1991), Association for Computing Machinery, Inc.
Филипп Ланглуа, Технический отчет, INRIA
Много информации об арифметике с плавающей точкой.
Статья Theory behind floating point comparisons раздела Boost.Test Floating point comparison может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Floating point comparison ::
реклама |