Почему С# позволяет:
1.0 / 0 // Infinity
И не позволяет:
1 / 0 // Division by constant zero [Compile time error]
Математически, существуют ли различия между целыми числами и числами с плавающей запятой при делении на нуль?
Почему С# позволяет:
1.0 / 0 // Infinity
И не позволяет:
1 / 0 // Division by constant zero [Compile time error]
Математически, существуют ли различия между целыми числами и числами с плавающей запятой при делении на нуль?
Согласно Microsoft, "арифметическое переполнение с плавающей запятой или деление на ноль никогда не генерирует исключение, потому что типы с плавающей точкой основаны на IEEE 754 и поэтому имеют положения для представления бесконечности и NaN (не числа)".
Подробнее об этом здесь.
Математически нет никакой разницы. Однако с компьютерами только стандартная спецификация с плавающей точкой IEEE-754 имеет специальные значения для представления ± ∞. Целые числа могут содержать только целые числа: -)
Стандарт IEEE для арифметики с плавающей точкой (IEEE 754) является наиболее широко используемым стандартом для вычислений с плавающей запятой, за которым следуют многие аппаратные и программные реализации, включая компилятор С#.
Это означает, что переменная с плавающей запятой в С# может содержать битовый шаблон, представляющий странные существа, такие как PositiveInfinity, NegativeInfinity и Not-a-Number (сокращенно NaN). В соответствии с арифметическими правилами IEEE 754 любое из этих не конечных значений с плавающей запятой может быть сгенерировано определенными операциями. Например, недопустимая операция с плавающей запятой, такая как деление нуля на ноль, приводит к NaN.
В ваших конкретных примерах вы можете видеть, что С# (в отличие от VB) перегружает оператор /, чтобы означать либо целочисленное, либо деление с плавающей запятой, в зависимости от числовых типов задействованных чисел.
В первом примере компилятор видит 1.0 и поэтому использует деление с плавающей запятой и переносит результат в переменную с плавающей запятой. Эта переменная содержит представление бесконечности.
Во втором примере компилятор видит 1 и поэтому использует целочисленное деление и помещает результат в целочисленную переменную. Поскольку интегральные типы в С# используют две системы дополнения для представления и не используют никаких специальных битовых шаблонов для представления бесконечности (или NaN), компилятор дает ошибку.
Существуют и другие интересные тонкости с плавающей запятой. И стоит прочитать запись в блоге Эрика Липперта по этому вопросу.
Деление с плавающей запятой поддерживается IEEE754, которое указывает, что деление на ноль должно быть бесконечным. Нет такого стандарта для целочисленного деления, поэтому они просто пошли со стандартными правилами математики.