Деление на ноль: int и float - PullRequest
1 голос
/ 18 декабря 2010

Разделив int на ноль, сгенерирует исключение, но с плавающей точкой - по крайней мере, в JavaПочему у float есть дополнительная информация о NaN, а у типа int нет?

Ответы [ 6 ]

8 голосов
/ 18 декабря 2010

Представление с плавающей точкой было разработано таким образом, что существует некоторая специальная комбинация битов, зарезервированных для хранения специальных значений , таких как NaN, бесконечность и т. Д.для типа int - каждый битовый шаблон соответствует целому числу.Это имеет много преимуществ:

  • Диапазон целочисленного типа настолько велик, насколько это возможно - битовые комбинации не теряются.
  • Представление целого числа легко понять, поскольку естьникаких особых случаев.
  • Целочисленная арифметика может быть выполнена с очень высокой скоростью даже на очень простых процессорах.
3 голосов
/ 18 декабря 2010

Четкое объяснение арифметики с плавающей точкой приведено здесь

http://www.artima.com/underthehood/floatingP.html

1 голос
/ 19 декабря 2010

Я думаю, что истинная причина, корень этого, хорошо известен: компьютеры хранят все в нулях и единицах.

Какое это имеет отношение к целым числам, числам с плавающей точкой и делению нуля?Это довольно просто.Если у вас есть только нули и единицы, их довольно легко объединить в целые числа, как вы делаете это с десятичными цифрами.Таким образом, «10» становится двумя, «11» становится тремя и так далее.Этот вид целочисленного представления настолько естественен, что никто не подумает придумать что-нибудь еще для целых чисел, это только сделает процессоры более сложными, а вещи - более запутанными.Единственное «изобретение», которое требовалось, это выяснить, как хранить отрицательные числа, но это также очень естественно и просто, если вы начнете с того момента, что x + (- x) всегда должно быть равно нулю, без использования какого-либо специального видадополнение здесь.Вот почему 11111111 равен -1 для 8-битных целых чисел, потому что если вы добавите к нему 1, он станет 100000000, а 8-й бит усекается из-за переполнения, и вы получите ноль.Но в этом естественном формате нет места для бесконечностей и NaN, и никто не хотел изобретать неестественное представление только для этого.Что ж, я не удивлюсь, если бы кто-то на самом деле сделал это, но нет никакого способа, чтобы такой формат стал широко известным и широко используемым.

Теперь для чисел с плавающей запятой нет естественного представления.Даже если мы переведем 0,5 в двоичную форму, это все равно будет что-то вроде 0,1, только теперь у нас есть «двоичная точка» вместо десятичной точки.Но процессоры не могут естественно представлять «точку», только 1 и 0. Поэтому нужен был какой-то особый формат.Другого пути просто не было.А потом кто-то, вероятно, предложил: «Эй, ребята, пока мы находимся, почему бы не включить специальное представление для бесконечности и прочей числовой чепухи?»и так было сделано.

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

1 голос
/ 18 декабря 2010

Java отражает способ реализации большинства процессоров. Целочисленное деление на ноль вызывает прерывание для x86 / x64, а деление с плавающей точкой на ноль приводит к бесконечности, отрицательной бесконечности или NaN. Примечание: с плавающей точкой вы также можете делить на отрицательный ноль. : P

1 голос
/ 18 декабря 2010

По сути, это чисто произвольное решение.

Традиционный int пытается использовать все биты для представления возможных чисел, тогда как Стандарт IEEE 754 резервирует специальное значение для NaN.

Стандарт можно изменить на int с, чтобы включить специальные значения за счет менее эффективных операций. Разработчики обычно ожидают, что операции int будут очень эффективными, тогда как операции с числами с плавающей запятой (чисто психологически) более допустимы для более медленных операций.

0 голосов
/ 18 декабря 2010

Ints и float по-разному представлены внутри машины.Целые числа, как правило, используют подписанное, дополняющее представление два, которое (по существу) является числом, записанным в базе два.Float, с другой стороны, использует более сложное представление, которое может содержать гораздо большие и гораздо меньшие значения.Тем не менее, машина резервирует несколько специальных битовых комбинаций для поплавков, чтобы обозначать другие вещи, кроме чисел.Например, есть значения для NaN, а также для положительной или отрицательной бесконечности.Это означает, что если вы делите число с плавающей точкой на ноль, существует ряд битов, которые компьютер может использовать для кодирования, которые вы поделили на ноль.Для целочисленных значений все битовые комбинации используются для кодирования чисел, поэтому нет значимых серий битов, которые компьютер мог бы использовать для представления ошибки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...