4

If I divide by 0, I get either a ZeroDivisionError, Infinity or NaN depending on what is divided.

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

I understand that 0.0 / 0 is not an Infinity (in math terms), while 3.0 / 0 is but why then isn't 3 / 0 an Infinity? Why dividing an integer throws an exception but dividing a float doesn't?

Evgeny Shadchnev
  • 7,320
  • 4
  • 27
  • 30

2 Answers2

9

In Ruby, not all numbers are created equal (pun intended).

Decimal numbers (0.0, 3.0) follow the IEEE 754-2008 standard for floating point arithmetic:

The standard defines arithmetic formats: sets of binary and decimal floating-point data, which consist of finite numbers (including signed zeros and subnormal numbers), infinities, and special "not a number" values (NaNs)

Whole numbers (0, 3) are treated as integers.

Both NaN and Infinity (as well as -Infinity) are special cases that such floats are designed to handle, but integers are not -- hence the error.

namuol
  • 9,816
  • 6
  • 41
  • 54
3

The reason why 3.0/0 equals Infinity is the IEEE 754 specification (Standard for Floating-Point Arithmetic), which Ruby implements.

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

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

Btw, I find this table pretty interesting: http://users.tkk.fi/jhi/infnan.html

martin
  • 2,150
  • 1
  • 34
  • 48