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

[dennou-ruby:000212] Re: BasicNumArray(Integer)



堀之内です。

ごとけんさん:
 > ここで問題なんですが、
 > 
 > ary ** ary
 > 
 > とすると、10**10 がlongに収まらないため補足できない間違いを
 > 生じると言う困ったことになります。
 ...
 > なお、浮動小数点数ではこういう問題はおきません。

なるほど、浮動小数点の場合(少なくともIEEEなら)正しく Inf を返し
てくれるけど、整数の場合勝手に変な値にされるのですね。手元の C 
コンパイラーで試してみたら、何ごともなかったかのように変な値が生
成されただけでしたが、普通そういうものなんでしょうか。知りません
でした。

さて、

 > んで、考えられる方法としては、BigFloatに一端変換してから演算
 > し、その結果がlongに収まるかどうかを調べるという方法です。し
 > かし、これだとパフォーマンスが落ちます。やたら落ちます。
 > 
 > 選択肢としては、
 > 
 >  * 結果の正当性はユーザに任せる
 >  * 少々遅くてもいいから結果のチェックををする
 > 
 > があります。どっちがいいですか?? 今のところ後者を取ろうかなぁ
 > と思ってます。なお、浮動小数点数ではこういう問題はおきません。

BasicArray は効率を重視したいので、C で対応してないのならそれに
習ってしまえばいいとも考えられます。少なくともやたら遅くなる対応
はすべきでないと思います。

整数で閉じる演算は四則と巾乗ぐらいだと思いますが(他にもあります
か?)、それなら Bignum に変換するより効率のいい方法として、逆演
算をやるというのはどうでしょう。つまり、例えば掛け算なら

     k=i*j

に対し、(i != 0) && (k/i != j) なら演算がうまく行ってないという
わけです。整数どうしの巾乗も C では掛け算の繰り返しで実装するで
しょうから (powは使えませんよね)、同様に対応できますね。

堀之内 武                 horinout@xxxxxx
京都大学超高層電波研究センター    611-0011 宇治市五ヶ庄
phone:0774-38-3812                     fax:0774-31-8463