Rubyでシステムの最大整数を決定できる必要があります。誰かがその方法を知っていますか、それが可能かどうか?
110342 次
6 に答える
81
FIXNUM_MAX = (2**(0.size * 8 -2) -1)
FIXNUM_MIN = -(2**(0.size * 8 -2))
于 2009-04-10T00:12:25.657 に答える
50
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
)です。これは、オブジェクト参照ではなく整数としてマークするために1ビットが使用されているためです。
于 2009-02-11T07:23:15.290 に答える
13
フレンドリーなマニュアルを読んでいますか?誰がそれをしたいですか?
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"
于 2009-02-11T23:59:47.793 に答える
11
ruby では、Fixnum は自動的に Bignum に変換されます。
可能な限り高い 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 ディスカッションから恥知らずに引き裂かれました。詳細については、そちらをご覧ください。
于 2009-02-11T07:18:10.387 に答える