[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:000273] int32 + bignum



ごとけんです

Int32とFixnumやBignumの演算結果の型はなんだと思いますか??

  * 最大長の短い方に合わせる # 今はこれを試してます
    (1) IntXX[Integer[intXX] op Integer[other]] # 今の仕様
    (2) IntXX[intXX op IntXX[other]]            # 別の候補

  * 最大長の長い方に合わせる
      int16 + 1 がFixintになるのでうれしくないと思う

  * abs を使った比較
      (int16[0] + 2**14).type == Int16
      (int16[0] + 2**15).type == Fixint # MAXINT16 == 2**15-1
      となるのでオペランドの型だけから判断がつかない

なお Klass[] はコンストラクタです。

もし最大長の短い方にするなら(1)と(2)のどちらがいいですか??
両者はレンジチェックのタイミングに違いがあり、(1)は演算後に
のみチェック、(2)は演算前にもチェックします(速度にはそれほど
差は出ません)。例えば i = 2**15 のときの i-int16 の挙動が違
います。(2)の場合、Int16[i] の時点でOverflowになりますが、
(1)なら int16 < 1 のときにOverflowです。どちらかと言えば(1)
がFortranやCに似てると言えるかも知れません。

-- gotoken