我需要能够确定Ruby中的系统最大整数。有人知道如何,或者是否可能?
Answers:
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
以获取字节数。我猜它在32位版本上应该是4,但是我现在无法测试。另外,最大的Fixnum显然是2**30 - 1
(或2**62 - 1
),因为使用一位将其标记为整数而不是对象引用。
阅读友好手册?谁想这样做?
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"
在红宝石中,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)
一场红宝石讨论无耻地撕掉了。在此处查看更多详细信息。
puts (Fixnum::MAX + 1).class
此操作,则不会Bignum
像看起来的那样返回。如果更改8
为16
它将。