ruby fixnum

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))