Почему в Ruby 0.0 / 0, 3.0 / 0 и 3/0 действуют по-разному?

Если я делю на 0, я получаю ZeroDivisionError, Infinity или NaN в зависимости от того, что делится.

ruby-1.9.2-p180 :018 > 0.0 / 0
 => NaN 

ruby-1.9.2-p180 :020 > 3.0 / 0
 => Infinity 

ruby-1.9.2-p180 :021 > 3 / 0
ZeroDivisionError: divided by 0

Я понимаю, что 0,0 / 0 - это не Бесконечность (в математическом плане), а 3,0 / 0 - но почему тогда 3/0 не Бесконечность? Почему деление целого числа вызывает исключение, а деление числа с плавающей запятой - нет?


person Evgeny Shadchnev    schedule 11.10.2011    source источник


Ответы (2)


В Ruby не все числа созданы равными (каламбур).

Десятичные числа (0.0, 3.0) соответствуют стандарту IEEE 754-2008 для арифметики с плавающей запятой:

Стандарт определяет арифметические форматы: наборы двоичных и десятичных данных с плавающей запятой, которые состоят из конечных чисел (включая нули со знаком и субнормальные числа), бесконечности и специальных «не числовых» значений ( NaN)

Целые числа (0, 3) рассматриваются как целые.

И NaN, и Infinity (а также -Infinity) являются особыми случаями, которые такие числа с плавающей запятой предназначены для обработки, а целые числа - нет - отсюда и ошибка.

person namuol    schedule 11.10.2011

Причина, по которой 3.0 / 0 равно бесконечности, - это спецификация IEEE 754 (стандарт для арифметики с плавающей запятой), которую реализует Ruby.

http://weblog.jamisbuck.org/2007/2/7/infinity

http://en.wikipedia.org/wiki/IEEE_754

Кстати, эта таблица мне очень интересна: http://users.tkk.fi/jhi/infnan.html

person martin    schedule 11.10.2011