Почему (интервал) дважды. NaN и (интервал) дважды. PositiveInfinity 0?

в <сильном> C# , если вы 0/0 вы получаете исключение.

Но если вы 0.0/0 или 0.0/0.0 вы добираетесь дважды. NaN и дважды. Бесконечность , соответственно.

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

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

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

22
nl ja de
Какой инструмент вы используете? В нормальном приложении NaN ==-2147483648 , или исключение, используя проверенный {}
добавлено автор Henk Holterman, источник

2 ответы

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

For a conversion from float or double to an integral type, the processing depends on the overflow checking context (§7.6.12) in which the conversion takes place:

  • In a checked context, the conversion proceeds as follows:
    • If the value of the operand is NaN or infinite, a System.OverflowException is thrown.
    • Otherwise, the source operand is rounded towards zero to the nearest integral value. If this integral value is within the range of the destination type then this value is the result of the conversion.
    • Otherwise, a System.OverflowException is thrown.
  • In an unchecked context, the conversion always succeeds, and proceeds as follows.
    • If the value of the operand is NaN or infinite, the result of the conversion is an unspecified value of the destination type.
    • Otherwise, the source operand is rounded towards zero to the nearest integral value. If this integral value is within the range of the destination type then this value is the result of the conversion.
    • Otherwise, the result of the conversion is an unspecified value of the destination type.

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

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

14
добавлено
у всех нет того же самого удовольствия: D!
добавлено автор PaRiMaL RaJ, источник
хорошо серьезно, как u держат все, что они наполняют в памяти?
добавлено автор PaRiMaL RaJ, источник
жаль, если я кажусь глупым, C# спекуляция чтение доступное для общественности?
добавлено автор PaRiMaL RaJ, источник
добавлено автор PaRiMaL RaJ, источник
@AppDeveloper: I' m сидящий в комнате с группой инженеров в команде C#, так определенно не чувствуя, что путь в данный момент:)
добавлено автор Jon Skeet, источник
@AppDeveloper: Кто говорит, что у меня есть он в памяти? Я открыл спекуляцию C# и искал "числовое преобразование".
добавлено автор Jon Skeet, источник
@AppDeveloper: It' s также установленный как часть Visual Studio, например, C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC#\Specifications
добавлено автор Jon Skeet, источник
@ChrisSinclair: Также, не вместо этого:)
добавлено автор Jon Skeet, источник
@AppDeveloper Да, просто попросите у Google его. (That' s вид пункта спекуляции; быть общественным документом, против которого могут проверить клиенты.)
добавлено автор Servy, источник
Джон Скит: Заседание в комнате с инженерами в команде C# , все же подпрыгивающий вокруг НАСТОЛЬКО отвечающих вопросов вместо этого.
добавлено автор Chris Sinclair, источник
Джон Скит: Заседание в комнате с инженерами в команде C# отвечающий ударом на удар и весело проведение время на ТАК с ними.
добавлено автор Chris Sinclair, источник

Это, главным образом вследствие того, что дважды. NAN и дважды. PositiveInfity (или дважды. Отрицательный для вопроса), не числа, а скорее ценности, чтобы определить понятие.

Метод или оператор возвращают NaN, когда результат операции <силен> неопределенный . Например, результатом деления ноля нолем является 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.");
0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot