2013-11-27 3 views
0

Я играл с математикой, и я заметил, что вместо того, чтобы бросать DivideByZeroException поплавки и двойники получить присваивается значение Infinitity, когда вы делите на ноль Почему это так?Divide By Zero не бросает DivideByZeroException с поплавком или двойным ... почему?

[TestMethod] 
    public void TestFloatDivideByZero() 
    { 

     double myDouble = 100.0; 
     var DbzDouble = 1000.0/((myDouble - myDouble)/myDouble); 
     // Infinity 

     float myFloat = 100.0f; 
     var DbzFloat = 1000.0/((myFloat - myFloat)/myFloat); 
     // Infinity 

     decimal myDecimal = 100M; 
     var DbzDecimal = 1000M/((myDecimal - myDecimal)/myDecimal); 
     // DivideByZeroException 

     int myInt = 100; 
     var DbzInt = 1000/((myInt - myInt)/myInt); 
     // DivideByZeroException 

    } 
+2

Поскольку 'float' и' double' * могут * выражать бесконечность, а также значения «not-a-number», тогда как целые типы не могут. –

ответ

4

Процессор с плавающей запятой, безусловно, может генерировать исключения при делении на ноль. Это функция, которая может быть включена или выключена программированием регистра управления. У этого была очень богатая история огромной боли, она очень слабеет, когда вы смешиваете библиотеки библиотек с разными предположениями об этой конфигурации. Чрезвычайно трудно справиться, у нашего собственного устаревшего кода есть множество мест, где он сбрасывает FPU после вызова библиотеки.

Превалирующее заключение заключалось в том, что с ним нельзя справиться и что единственным разумным вариантом является отключение исключений. Следуя этому правилу, большинство современных библиотек поддержки времени выполнения.

CLR не является исключением, он настраивает FPU, чтобы не генерировать исключения и позволить процессору генерировать бесконечность. Также закреплено в стандарте CLI, а также в стандарте языка C#. При необходимости вам нужно использовать Double.IsInfinity(), чтобы создать собственное исключение.

Смежные вопросы