Мне нужно определить максимальное число систем в Ruby. Кто-нибудь знает, как это сделать или если это возможно?
Ruby max integer
Ответ 1
Ruby автоматически преобразует целые числа в большой целочисленный класс, когда они переполняются, поэтому (практически) нет предела тому, насколько велики они могут быть.
Если вы ищете размер машины, то есть 64- или 32-разрядный, я нашел этот трюк на 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
Если вы ищете размер объектов Fixnum (целые числа, достаточные для хранения в одном машинном слове), вы можете вызвать 0.size
, чтобы получить количество байтов. Я предполагаю, что это должно быть 4 в 32-битных сборках, но я не могу проверить это прямо сейчас. Кроме того, наибольший Fixnum, по-видимому, 2**30 - 1
(или 2**62 - 1
), потому что один бит используется, чтобы пометить его как целое, а не ссылку на объект.
Ответ 2
FIXNUM_MAX = (2**(0.size * 8 -2) -1)
FIXNUM_MIN = -(2**(0.size * 8 -2))
Ответ 3
Чтение дружественного руководства? Кто захочет это сделать?
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"
Ответ 4
В ruby Fixnums автоматически преобразуются в Bignums.
Чтобы найти максимально возможный Fixnum, вы можете сделать что-то вроде этого:
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)
Бесстыдно разорвано из обсуждение ruby-talk. Посмотрите там более подробную информацию.
Ответ 5
as @Jörg W Mittag указал: в jruby размер фиксированного num всегда равен 8 байтам. Этот фрагмент кода показывает правду:
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