64bit長以上の計算はRubyにお任せ

プログラムのバグ修正をするときに64bit長(約2千京)の整数の計算を確認する必要がありました。 しかし、手持ちの電卓やオンラインの電卓で64bit長ギリギリの計算ができないんですね。エラーも吐かずに答えが間違っているものもちらほらありました。 どうしようか考えている時に、Rubyでは31bit*1を超える数を扱うときに自動的にBignumに変換され、ほとんど無限桁*2の計算ができることを思い出しました。

加減乗除

$ ruby -e "puts 17293822569102704659 + 1"
17293822569102704660
$ ruby -e "puts 17293822569102704659 - 1"
17293822569102704658
$ ruby -e "puts 17293822569102704659 * 49"
847397305886032528291
$ ruby -e "puts 847397305886032528291 / 49"
17293822569102704659

余り

$ ruby -e "puts 847397305886032528292 % 49"
1

冪乗

$ ruby -e "puts 847397305886032528291 ** 49"
299410390190802054749918695294118178768666364157201158847876378875892148528528490766536289930242614417203176503141942537641556895268693480282928279974829333588718093858747677035833213175727118411325314655767868091615267226746468812654149929866008523638065317815506979890218893709080502283374303282996545135372385617448764965080119848829846436781486978235343078892672922911862247836730262591383554509210886421045590070200777572441746320081961625614561393976638591103611359906785060949305922292730815469858888158884500134962229869587884555707170748994074809041011369977420215473060081028235478896640206299960869318434769166871641482184760758142490935875980506376118606487687628035420381819650573907742526876033480268792039724694808574145831561471522160364594255766896242126366359264480607053816393048981299496597201788645911052134818253593241671174518656851089518954701472962272010750047822544578908744788743107069286326315145964797807858337701222385356695853670492477256353649453350444084757929233183478601702761133590670723811

16進数へ変換

$ ruby -e "puts 17293822569102704659.to_s(16)"
f000000000000013

10進数へ変換

$ ruby -e "puts 0xf000000000000013"
17293822569102704659

括弧やビット演算機能があるので、エンジニア以外の方も困ったらRuby電卓で!

*1:リファレンスマニュアルではFixnumは「ほとんどのマシンでは 31 ビット幅」まで扱う事ができると記載されています。多分Fixnumはintで扱える値をカバーするのだと思います。intが64bitの場合は63bit幅まで扱えるのではないかな?

*2:主記憶の容量次第。