Почему C # позволяет делить ненулевое число на ноль в типе с плавающей точкой? - PullRequest
51 голосов
/ 24 ноября 2010

Почему C # позволяет:

1.0 / 0 // Infinity

И не позволяет:

1 / 0 // Division by constant zero [Compile time error]

Математически, есть ли различия между целыми числами и числами с плавающей точкой при делении на ноль?

Ответы [ 4 ]

48 голосов
/ 24 ноября 2010

Согласно Microsoft, «арифметическое переполнение с плавающей точкой или деление на ноль никогда не вызывает исключение, потому что типы с плавающей точкой основаны на IEEE 754 и поэтому имеют условия для представления бесконечности и NaN (не числа)».

Подробнее об этом здесь .

13 голосов
/ 24 ноября 2010

Математически разницы нет. Однако на компьютерах только стандартная спецификация IEEE-754 с плавающей запятой имеет специальные значения для представления ± ∞. Целые числа могут содержать только ... целые числа: -)

8 голосов
/ 24 ноября 2010

Стандарт IEEE для арифметики с плавающей точкой (IEEE 754) является наиболее широко используемым стандартом для вычислений с плавающей точкой и сопровождается многими аппаратными и программными реализациями, включая компилятор C #.

Это означает, что переменная с плавающей точкой в ​​C # может содержать битовую комбинацию, которая представляет странные существа, такие как PositiveInfinity, NegativeInfinity и Not-a-Number (сокращенно NaN). Согласно арифметическим правилам IEEE 754, любое из этих не конечных значений с плавающей точкой может быть сгенерировано определенными операциями. Например, недопустимая операция с плавающей точкой, такая как деление нуля на ноль, приводит к NaN.

В ваших конкретных примерах вы можете видеть, что C # (в отличие от VB) перегружает оператор / для обозначения целочисленного или деления с плавающей запятой, в зависимости от числовых типов используемых чисел.

В первом примере компилятор видит 1.0, и поэтому использует деление с плавающей точкой и помещает результат в переменную с плавающей точкой. Эта переменная содержит представление бесконечности.

Во втором примере компилятор видит 1 и поэтому использует целочисленное деление и помещает результат в целочисленную переменную. Поскольку целочисленные типы в C # используют для представления систему с дополнением до двух и не используют никаких специальных битовых шаблонов для представления бесконечности (или NaN), компилятор выдает ошибку.

Есть и другие интересные тонкости с плавающей точкой . И стоит прочесть запись Эрика Липперта в блоге на эту тему.

7 голосов
/ 24 ноября 2010

Деление с плавающей запятой обеспечивается IEEE754, в котором указано, что деление на ноль должно быть бесконечностью. Нет такого стандарта для целочисленного деления, поэтому они просто следовали стандартным правилам математики.

...