Ruby max integer Ruby max integer ruby ruby

Ruby max integer


FIXNUM_MAX = (2**(0.size * 8 -2) -1)FIXNUM_MIN = -(2**(0.size * 8 -2))


Ruby automatically converts integers to a large integer class when they overflow, so there's (practically) no limit to how big they can be.

If you are looking for the machine's size, i.e. 64- or 32-bit, I found this trick at ruby-forum.com:

machine_bytes = ['foo'].pack('p').sizemachine_bits = machine_bytes * 8machine_max_signed = 2**(machine_bits-1) - 1machine_max_unsigned = 2**machine_bits - 1

If you are looking for the size of Fixnum objects (integers small enough to store in a single machine word), you can call 0.size to get the number of bytes. I would guess it should be 4 on 32-bit builds, but I can't test that right now. Also, the largest Fixnum is apparently 2**30 - 1 (or 2**62 - 1), because one bit is used to mark it as an integer instead of an object reference.


Reading the friendly manual? Who'd want to do that?

start = Time.nowlargest_known_fixnum = 1smallest_known_bignum = niluntil smallest_known_bignum == largest_known_fixnum + 1  if smallest_known_bignum.nil?    next_number_to_try = largest_known_fixnum * 1000  else    next_number_to_try = (smallest_known_bignum + largest_known_fixnum) / 2 # Geometric mean would be more efficient, but more risky  end  if next_number_to_try <= largest_known_fixnum ||       smallest_known_bignum && next_number_to_try >= smallest_known_bignum    raise "Can't happen case"   end  case next_number_to_try    when Bignum then smallest_known_bignum = next_number_to_try    when Fixnum then largest_known_fixnum = next_number_to_try    else raise "Can't happen case"  endendfinish = Time.nowputs "The largest fixnum is #{largest_known_fixnum}"puts "The smallest bignum is #{smallest_known_bignum}"puts "Calculation took #{finish - start} seconds"