Почему C# позволяет делить ненулевое число на ноль в типе с плавающей запятой?


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

1.0 / 0 // Infinity

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

1 / 0 // Division by constant zero [Compile time error]
С математической точки зрения, есть ли разница между целыми числами и числами с плавающей запятой при делении на ноль?
4 48

4 ответа:

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

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

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

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

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

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

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

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

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

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