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


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 など動作環境依存.