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

[dennou-ruby:000211] BasicNumArray(Integer)



ごとけんです

ちょっと、相談にのって下さい。

BasicNumArrayは(まだ謎のリークがあるのを除けば ^^;;)大体出来
たんですが、整数配列の演算で困ってます。

たとえば

n = 5
default = 10
ary = BasicNumArray(Integer).new(n,default)
#=> [10, 10, 10, 10, 10]

です。今の段階で以下のようなことが出来ます。

2 * ary
#=> [20, 20, 20, 20, 20]
ary * ary
#=> [100, 100, 100, 100, 100]

ここで問題なんですが、

ary ** ary

とすると、10**10 がlongに収まらないため補足できない間違いを
生じると言う困ったことになります。これは非常に大きな2整数の
和などでも同様です。10**10とかいう制限は32bit整数に由来する
のですが、alpha の64bit整数が使えるようになったとしても、制
限があることには変わりません。

んで、考えられる方法としては、BigFloatに一端変換してから演算
し、その結果がlongに収まるかどうかを調べるという方法です。し
かし、これだとパフォーマンスが落ちます。やたら落ちます。

選択肢としては、

 * 結果の正当性はユーザに任せる
 * 少々遅くてもいいから結果のチェックををする

があります。どっちがいいですか?? 今のところ後者を取ろうかなぁ
と思ってます。なお、浮動小数点数ではこういう問題はおきません。

-- gotoken