Является ли x! = 0.0 безопасной проверкой на исключение DivideByZeroException? - PullRequest
4 голосов
/ 07 февраля 2012

Чтобы исключить DivideByZeroException в C #, люди часто пишут такие вещи, как

double f(double x) {
  if (x != 0.0) return 1000.0/x;
  else return 0.0;
}

Учитывая тот факт, что арифметика с плавающей запятой всегда имеет неточности, мне интересно, гарантируется ли, что эта функция никогда не вызовет исключение DivideByZeroException.

Ответы [ 2 ]

8 голосов
/ 07 февраля 2012

В любом случае это не будет DivideByZeroException, так как вы имеете дело с double арифметикой - оно просто вернет бесконечность.Другие значения могут возвращать бесконечность, например f(double.Epsilon).

1 голос
/ 07 февраля 2012

Документация гласит:

Деление значения с плавающей точкой на ноль приведет к положительной бесконечности, отрицательной бесконечности или не числовому значению (NaN) в соответствии с правилами арифметики IEEE 754. Операции с плавающей точкой никогда не выдают исключение. Для получения дополнительной информации см. Single и Double.

Так что да, «гарантируется, что эта функция никогда не вызовет исключение DivideByZeroException». - даже без какой-либо проверки, но он может возвращать положительную бесконечность, отрицательную бесконечность или Not-a-Number (NaN), даже если вы проверяете 0.0, например, когда вы делите довольно большое значение на действительно маленькое значение так, чтобы результат превышает диапазон, охватываемый двойным.

...