8

irb で 3**557 を計算しようとしたときに、この問題に遭遇しました。私の Mac (OS X 10.8) には Ruby と MacRuby の両方がインストールされています。また、ruby のバージョンは MacRuby 0.12 (ruby 1.9.2) の 1.8.7 です。rib と macirb は、3**557 の計算で 2 つの異なる答えをくれました。(macirbのは正しいです。)

$ irb
>> 3**557
=> 54755702179342762063551440788945541007926808765326951193810107165429610423703291760740244724326099993131913104272587572918520442872536889724676586931200965615875242243330408150984753872526006744122187638040962508934109837755428764447134683114539218909666971979603

$ macirb
irb(main):001:0> 3**557
=> 57087217942658063217290581978966727348872586279944803346410228520919738045995056049600505293676159316424182057188730248707922985741467061108015301244570536546607487919981026877250949414156613856336341922395385463291076789878575326012378057561766997352898452974964563

それからもっと大きなもの、例えば 3**5337 を試してみましたが、今回も同じ答えが得られました。

これは Ruby 1.8.7 のバグですか、それとも別の方法でべき乗を計算する必要がありますか?

4

5 に答える 5

2

1.9.3 を使用すると正しい結果が得られます。1.8.7 は段階的に廃止されるため、よほどの理由がない限り、1.9.3 以降を使用するようにしてください。

Linux で 1.8.7-p358 を使用してテストした後、正しい答えが得られたことも注目に値します。使用している 1.8.7 の特定のバージョンのバグである可能性があります。

于 2012-08-17T17:40:47.060 に答える
1

これは間違いなくバグです。おそらく、プロセッサやコンパイル オプションに依存しています。

この commitによって修正されたとしても、私は驚かないでしょう。

他の人が述べているように、現在はセキュリティ修正のみが 1.8.7 になっているので、1.9.3 にアップグレードしてください。

于 2012-08-17T21:05:32.837 に答える
0

べき乗とは明示的に関係ありません。表現に必要な 63 ビットから 64 ビットへの移行に何らかの形で関連していると思いますが、これは 100% 一貫しているようには見えません。

>> 19**14
=> 799006685782884121
>> 19**15
=> -3265617043834753317
>> (19**14)*19
=> -3265617043834753317

>> 2**64-1
=> -1
>> 2**64
=> 0
>> 0x7fffffffffffffff
=> 9223372036854775807

まだ

>> 0x8000000000000000
=> 9223372036854775808

また、irb を 32 ビット モード ( arch -i386 irb) で実行しています。この時点ではこれは表示されませんが、以前は次のように表示されていました。

>> 19**15
=> 15181127029874798299
>> 2**31
=> -2147483648
于 2013-03-15T16:44:19.797 に答える
0

独自の累乗法を書くことは、エラーを発生させない別の方法のようです:

def xpnt(base, exponent)
    sum = base
    while exponent >= 2
        sum = sum * base
        exponent -= 1
    end
    puts sum
end

'10' の累乗は、単一の '1' で始まり、その後にゼロだけが続く必要があります。ルビーの**機能:

10 ** 40
=> 10000000000000000000092233720368547758080

カスタムxpnt方法:

xpnt 10, 40
10000000000000000000000000000000000000000
=> nil
于 2013-05-06T16:14:41.190 に答える