Типирование int для float превращает DivideByZeroException в бесконечность - PullRequest
2 голосов
/ 17 октября 2011

Я написал простую divide функцию на C #:

    private string divide(int a, int b)
    {
        return string.Format("Result: {0}", a / b);
    }

Вызов MessageBox.Show(divide(3, 0)) приводит, как и следовало ожидать, к DivideByZeroException.

Поэтому я решилtypecast a в число с плавающей точкой (чтобы получить возвращаемое значение не целого числа), например так:

    private string divide(int a, int b)
    {
        return string.Format("Result: {0}", (float)a / b);
    }

Как ни странно, теперь это показывает мне Результат: Infinity .

Мне это кажется ошибкой, хотя я могу ошибаться.Это потому, что результат теперь является плавающим, и он рассматривается как возвращаемое значение 3 / 1 x 10^-99999 или что-то похожее?

Я довольно ошеломлен этим результатом.

Ответы [ 3 ]

3 голосов
/ 17 октября 2011

Это поведение при преобразовании int в float.Это было взято из документации MSDN :

Разделение значения с плавающей точкой на ноль приведет к положительной бесконечности, отрицательной бесконечности или не-числу (NaN) в соответствии с правилами IEEE 754 арифметики.Операции с плавающей точкой никогда не выдают исключение.Для получения дополнительной информации см. Single и Double .

2 голосов
/ 17 октября 2011

С MSDN в разделе Арифметическое переполнение :

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

1 голос
/ 17 октября 2011

Нет, для операций с плавающей точкой это правильно.

Стандарт IEEE с плавающей запятой, поддерживаемый почти всеми современными модулями с плавающей запятой, указывает, что каждая арифметическая операция с плавающей запятой, включая деление на ноль, имеет четко определенный результат. Стандарт поддерживает ноль со знаком, а также бесконечность и NaN (не число). Есть два нуля, +0 (положительный ноль) и -0 (отрицательный ноль), и это устраняет любую неопределенность при делении. В арифметике IEEE 754 a ÷ + 0 - это положительная бесконечность, когда a положительна, отрицательная бесконечность, когда a отрицательна, и NaN, когда a = ± 0. Вместо этого знаки бесконечности изменяются при делении на -0.

Ссылка

...