Ruby最大整数
我需要能够在Ruby中确定系统最大整数。 任何人都知道如何,或者如果有可能?
当Ruby溢出时,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,但我现在无法testing。 此外,最大的Fixnum显然是2**30 - 1
(或2**62 - 1
),因为一个位用来标记为整数而不是对象引用。
FIXNUM_MAX = (2**(0.size * 8 -2) -1) FIXNUM_MIN = -(2**(0.size * 8 -2))
阅读友好的手册? 谁想要这样做?
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"
在rubyFixnums自动转换为Bignums。
要find最高可能的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谈话讨论中撕下。 看那里的更多细节。
正如@JörgW 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