Причина, по которой сравнение чисел с плавающей точкой на равенство часто проблематично, состоит в том, что арифметика с плавающей точкой только приближает к реальной арифметике.Поэтому, если у нас есть два числа x
и y
, которые были вычислены с помощью арифметики с плавающей точкой, вычисление x == y
в общем случае не говорит нам, являются ли два числа x и y , рассчитанный с точной математикой, будет равен.Другими словами, вопрос о том, не дает ли x == y
, с уверенностью, того ответа, который мы хотим (если мы не тщательно разработали и не проанализировали код для этой цели).
Та же проблема существует с такими реляционными операторамикак <
.Если у нас есть x
и y
, один или оба из которых отличаются от идеально вычисленных x или y на некоторое небольшое количество, тогда x < y
может быть истинным, в то время как x <<em> y неверно или наоборот.
Нет общего решения этой проблемы.В некоторых приложениях ошибка может быть допустимой.В некоторых приложениях может быть возможно получить границу для ошибки с плавающей точкой e , чтобы мы могли доказать, что, скажем, если x < y-e
верно, то x <<em> у верно.(Но тогда, если x < y-e
ложно, мы не уверены в x <<em> y .) Таким образом, подходящее решение зависит от конкретного приложения.