Целочисленное деление на ноль и Float (реальное число) деление на ноль - PullRequest
2 голосов
/ 28 января 2012

Если я запускаю следующую строку кода, я получаю DIVIDE BY ZERO ошибку

1. System.out.println(5/0);

что является ожидаемым поведением.

Теперь я запускаю следующую строку кода

2. System.out.println(5/0F);

здесь нет ошибки DIVIDE BY ZERO, скорее это показывает INFINITY

В первой строке я делю два целых числа, а во второй два действительных числа.

Почему деление на ноль для целых дает ошибку DIVIDE BY ZERO, а в случае действительных чисел INFINITY

Я уверен, что это не относится ни к какому языку программирования.

Ответы [ 2 ]

5 голосов
/ 28 января 2012

(РЕДАКТИРОВАТЬ: вопрос был немного изменен - ​​в частности, в одном месте он ссылался на Java.)

Целочисленные типы в Java не имеют представления бесконечности, "не числовые значения и т. д., в то время как типы IEEE-754 с плавающей запятой, такие как float и double, делают.Это так просто, правда.На самом деле это не «реальная» и «целочисленная» разница - например, BigDecimal также представляет действительные числа, но это также не имеет представления бесконечности.

EDIT:Просто чтобы быть понятным, этот * специфичен для конкретного языка / платформы, так как вы можете создать свой собственный язык / платформу, которая работает по-другому.Однако базовые процессоры обычно работают одинаково - поэтому вы обнаружите, что многие, многие языки ведут себя таким образом.

РЕДАКТИРОВАТЬ: С точки зрения мотивация , имейте в виду, что дляВ частности, в случае бесконечности существуют способы добраться до бесконечности без деления на ноль - например, деление на очень, очень маленькое число с плавающей запятой.В случае целых чисел, очевидно, нет ничего между нулем и единицей.

Также имейте в виду, что случаи, в которых используются целые числа (или десятичные типы с плавающей запятой), как правило, не нуждаются в понятии бесконечности, илирезультат «не число» - тогда как в научных приложениях (где float / double обычно более полезны), «бесконечность» (или, по крайней мере, «число, которое слишком велико, чтобы разумно представлять») все еще потенциальнодействительный результат.

0 голосов
/ 28 января 2012

Это , специфичное для одного языка программирования или семейства языков. Не все языки позволяют использовать целые числа и числа с плавающей точкой в ​​одном выражении. Не все языки имеют оба типа (например, реализации ECMAScript, такие как JavaScript, не имеют внешнего вида целочисленного типа). Не все языки имеют такой синтаксис для преобразования встроенных значений.

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

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

В математике действительных чисел деление числа на число, близкое к нулю, эквивалентно умножению первого числа на число, абсолютное значение которого очень велико (x / (1 / y) = x * y). Поэтому разумно, чтобы результат деления на ноль был (определен как) бесконечность, поскольку точность значения с плавающей запятой была бы превышена.

Подробности реализации можно найти в спецификации этого языка программирования.

...