[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