Почему в Ruby 0.0 / 0, 3.0 / 0 и 3/0 ведут себя по-разному? - PullRequest
4 голосов
/ 11 октября 2011

Если я делю на 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 - это бесконечность?Почему деление целого числа вызывает исключение, а деление числа с плавающей запятой - нет?

Ответы [ 2 ]

9 голосов
/ 11 октября 2011

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

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

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

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

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

3 голосов
/ 11 октября 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

...