Edited at

mrubyとISO Ruby (CRuby)の非互換部分(数値関連編)

More than 5 years have passed since last update.

mruby の仕様はまだ未確定であり,仕様変更に伴い,下記の挙動も変更となる可能性が十分にあることに留意.


1 / 2 の結果

CRuby は 0.mruby は 0.5.

一般に,FixNum / FixNum の結果は,Float.


1 / 0 の結果

CRuby では ZeroDivisionError の発生. mruby では inf が返り raise は起きない.

ちなみに -1 / 0 の mruby での結果は -inf.


大きな数値の演算結果

mruby には BigNum が無いので,CRuby との非互換が生じる.


シフト演算子の挙動

p (1 << 32) - 1

CRuby では4294967295.mruby では RangeError が raise.ただし,mruby での RangeError の発生は,内部表現 mrb_int のビットサイズに依存する.(mrb_int のビットサイズが 33 ビット以上なら,上記演算で CRuby と同一の結果が得られる可能性もある)


加算乗算べき乗算などの挙動

p 2 ** 64 - 1

CRuby では 18446744073709551615.mruby では 1.844674407371e+19 など動作環境依存.