Necesito poder determinar un entero máximo de sistema en Ruby. Alguien sabe cómo, o si es posible?Número máximo de Ruby
Respuesta
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 usted está buscando para el tamaño de la máquina, es decir, de 64 o de 32 bits, encontré this trick at 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 usted está buscando el tamaño de los objetos Fixnum (enteros suficiente para pequeños almacenar en una sola palabra de máquina), puede llamar al 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.
En ruby, los Fixnums se convierten automáticamente en Bignums.
Para encontrar la más alta Fixnum posible que usted podría 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 ser copiados desde un ruby-talk discussion. Mire allí para más detalles.
Si lo hace 'puts (Fixnum :: MAX + 1) .class' este no devuelve' Bignum' como parece como debería. Si cambia '8' a' 16', lo hará. –
esto no está disponible ahora – allenhwkim
¿Lees el manual de instrucciones? ¿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"
Esta parece ser la única respuesta que devuelve números en la transición de Fixnum a Bignum, que, para mí, significa que es el Fixnum más grande en Ruby. –
FIXNUM_MAX = (2**(0.size * 8 -2) -1)
FIXNUM_MIN = -(2**(0.size * 8 -2))
como @ Jörg W Mittag señaló: en jruby, fijar el tamaño num es siempre de 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
- 1. Método de Ruby con número máximo de parámetros
- 2. Número máximo de Err.Raise?
- 3. Número máximo de cookies permitidas
- 4. Número máximo de HttpWebRequests concurrentes
- 5. Número máximo de instrucciones GLSL
- 6. Parámetros de función número máximo
- 7. Funciones de PHP: número máximo de argumentos
- 8. Número máximo de tablas en MySQL
- 9. WCF Service Número máximo de métodos
- 10. ¿Número máximo de inodos en un directorio?
- 11. Número máximo de UILocalNotification para iphone
- 12. Número de hilo máximo para una aplicación?
- 13. Jenkins: número máximo de trabajos simultáneos
- 14. Número máximo de procesos en Linux
- 15. Número máximo de elementos enum en Java
- 16. OpenSSL configure el número máximo de conexiones
- 17. Python máximo con igual número de casos
- 18. Aumento MongoDB número máximo de conexiones
- 19. Número máximo de unidades en windows?
- 20. Número máximo de caracteres stringbuilder puede acomodar
- 21. iphone y notificaciones: ¿número máximo de notificaciones?
- 22. SQL DELETE - Número máximo de filas
- 23. Número de serie de Android: predeterminado mín., Máximo de XML
- 24. Ruby: contar el número de 1 de un número binario
- 25. Ayuda: Número máximo de clientes alcanzados - Error de segmentación
- 26. Número máximo de parámetros en la declaración de función
- 27. R: Integrar: Número máximo de subdivisiones alcanzadas, error de redondeo
- 28. ¿Número máximo de puertos abiertos simultáneos de Erlang?
- 29. Limite un número máximo de filas de sqlite
- 30. número máximo de carga de archivos permitidos se ha superado
Bastante seguro que quiere 2 ** (machine_size * 8) -1; 2 ** 4-1 = 15 que no es algo muy grande. – Cebjyre
Vaya, creo que comencé a pensar demasiado sobre bytes en lugar de bits. –
ADVERTENCIA: el código es inútil. Lea la edición, ignore el código. No encuentra el máximo de nada para Ruby. Lo encuentra para código que no usa punteros etiquetados. –