Для равенства: (т.е. ==
или !=
) да.
Для других сравнительных операторов (<
, >
, <=
, >=
) это зависит от того, находитесь ли вы на граничных случаях, например, является ли <
эквивалентным <=
, что является еще одним случаем равенства. Если вас не волнуют крайние случаи, это обычно не имеет значения, хотя это зависит от того, откуда берутся ваши входные числа и как они используются.
Если вы ожидаете, что (3.0/10.0) <= 0.3
будет оцениваться как true
(это может не произойти, если ошибка с плавающей запятой приводит к тому, что значение 3.0 / 10.0 будет немного больше 0,3, как 0.300000000001), и ваша программа будет вести себя плохо, если она оценивает как false
- это крайний случай, и вы должны быть осторожны.
Хорошие численные алгоритмы почти никогда не должны зависеть от равенства и краевых случаев. Если у меня есть алгоритм, который принимает в качестве входных данных 'x
', любое число от 0 до 1, в общем случае не имеет значения, 0 < x < 1
или 0 <= x <= 1
. Однако есть исключения: вы должны быть осторожны при оценке функций с точками ветвления или особенностями.
Если у меня есть промежуточное значение y
, и я ожидаю y >= 0
, и я оцениваю sqrt(y)
, то я должен быть уверен, что ошибки с плавающей точкой не приводят к тому, что y будет очень маленьким отрицательным числом и функция sqrt()
для выдачи ошибки. (Предполагая, что это ситуация, когда комплексные числа не задействованы.) Если я не уверен насчет числовой ошибки, я, вероятно, вместо этого оценим sqrt(max(y,0))
.
Для таких выражений, как 1/y
или log(y)
, в практическом смысле не имеет значения, является ли y нулем (в этом случае вы получаете ошибку особенности) или y является числом, очень близким к нулю (в этом случае вы я получу очень большое число, величина которого очень чувствительна к значению y) - оба случая "плохие" с числовой точки зрения, и мне нужно пересмотреть то, что я пытаюсь сделать, и что поведение, которое я ищу, когда y
значения находятся в окрестности нуля.