[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