Ruby max entero
fixnum (5)
Necesito poder determinar un entero máximo de sistemas en Ruby. Alguien sabe cómo, o si es posible?
¿Leyendo el manual amigable? ¿Quién querría hacer eso?
start = Time.now
largest_known_fixnum = 1
smallest_known_bignum = nil
until 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"
end
end
finish = Time.now
puts "The largest fixnum is #{largest_known_fixnum}"
puts "The smallest bignum is #{smallest_known_bignum}"
puts "Calculation took #{finish - start} seconds"
En Ruby, los Fixnums se convierten automáticamente en Bignums.
Para encontrar el Fixnum más alto posible, puede hacer algo como esto:
class Fixnum
N_BYTES = [42].pack(''i'').size
N_BITS = N_BYTES * 8
MAX = 2 ** (N_BITS - 2) - 1
MIN = -MAX - 1
end
p(Fixnum::MAX)
Desvergonzadamente arrancado de una discusión de ruby talk . Mire allí para más detalles.
Ruby convierte automáticamente enteros a una clase entera grande cuando se desbordan, por lo que no hay límite (prácticamente) para lo grandes que pueden ser.
Si está buscando el tamaño de la máquina, es decir, 64 o 32 bits, encontré este truco en ruby-forum.com :
machine_bytes = [''foo''].pack(''p'').size
machine_bits = machine_bytes * 8
machine_max_signed = 2**(machine_bits-1) - 1
machine_max_unsigned = 2**machine_bits - 1
Si está buscando el tamaño de los objetos Fixnum (enteros lo suficientemente pequeños como para almacenarlos en una sola palabra de máquina), puede llamar a 0.size
para obtener el número de bytes. Supongo que debería ser 4 en compilaciones de 32 bits, pero no puedo probar eso ahora. Además, el Fixnum más grande es aparentemente 2**30 - 1
(o 2**62 - 1
), porque un bit se usa para marcarlo como un número entero en lugar de una referencia de objeto.
como lo señaló @ Jörg W Mittag: en jruby, el arreglo num size siempre tiene 8 bytes de longitud. Este fragmento de código muestra la verdad:
fmax = ->{
if RUBY_PLATFORM == ''java''
2**63 - 1
else
2**(0.size * 8 - 2) - 1
end
}.call
p fmax.class # Fixnum
fmax = fmax + 1
p fmax.class #Bignum
FIXNUM_MAX = (2**(0.size * 8 -2) -1)
FIXNUM_MIN = -(2**(0.size * 8 -2))