Подтвердить что ты не робот

Почему (int) double.NaN и (int) double.PositiveInfinity равны 0?

в С#, если вы 0/0 получаете исключение.

Но если вы 0.0/0 или 0.0/0.0 получаете double.NaN и double.Infinity, соответственно.

но если вы передадите эти результаты в int, вы получите 0.

> (int)double.PositiveInfinity
0
> (int)double.NaN
0

Почему это так? Разве время выполнения не должно давать ошибку кастинга, потому что бесконечность явно не равна нулю?

4b9b3361

Ответ 1

Это зависит от того, в каком контексте вы находитесь. Если вы используете контекст checked, вы получите исключение. Соответствующий раздел спецификации - раздел 6.2.1:

Для преобразования из float или double в интегральный тип обработка зависит от контекста проверки переполнения (§7.6.12), в котором происходит преобразование:

  • В проверенном контексте преобразование происходит следующим образом:
    • Если значение операнда равно NaN или бесконечно, генерируется исключение System.OverflowException.
    • В противном случае исходный операнд округляется до нуля до ближайшего целочисленного значения. Если это целочисленное значение находится в пределах диапазона назначения, то это значение является результатом преобразования.
    • В противном случае выдается исключение System.OverflowException.
  • В неконтролируемом контексте преобразование всегда выполняется успешно и выполняется следующим образом.
    • Если значение операнда равно NaN или бесконечно, результатом преобразования является неопределенное значение типа назначения.
    • В противном случае исходный операнд округляется до нуля до ближайшего целочисленного значения. Если это целочисленное значение находится в пределах диапазона назначения, то это значение является результатом преобразования.
    • В противном случае результатом преобразования является неопределенное значение типа назначения.

Таким образом, в неконтролируемом контексте ответ не обязательно равен 0 - это неопределенное значение int. Фактически, в моем тестировании он появляется как int.MinValue, а не 0 в неконтролируемом контексте.

Но в принципе, если вы хотите сделать проверку, используйте проверенный контекст (по крайней мере для этого выражения).

Ответ 2

В основном это связано с тем, что double.NAN и double.PositiveInfity(или double.Negative для этого вопроса) не являются числами, а скорее значениями для определения понятия.

Метод или оператор возвращает NaN, когда результат операции undefined. Например, результат деления нуля на ноль равен NaN, как показано в следующем примере.

попробуйте это, чтобы проиллюстрировать эту концепцию.

if ((0 / zero) == Double.NaN) 
     Console.WriteLine("0 / 0 can be tested with Double.NaN.");
  else 
     Console.WriteLine("0 / 0 cannot be tested with Double.NaN; use Double.IsNan() instead.");