まつもと ゆきひろです.

In message "[ruby-list:880] Bug report and Request"
    on 96/10/22, Keiju ISHITSUKA <keiju / shljapan.co.jp> writes:
|
|けいじゅ@SHLジャパンです. 

|[1] print 10000000000000000000000 - 10000000000000000000001
|
|やってみればわかります. 変な結果が出ます. Bignumの引き算で結果がマイナ
|スになる時におかしくなるようです.

はい,修正しました.条件は大きさの近いBignum同士の引き算で結
果が負になるものでした.MS Byteでしか大きさチェックを行って
いなかったせいで,負になるなることを検出できないでいました.

|[2]
|    $stdout.sync = TRUE
|    print a = Float(982273762)
|    print b = Float(1184838904)
|    print a/b
|    --
|    9.82274e+08 1.62161e-308 Floating exception
|
|bの結果が明らかにおかしいですね. あとちょっと気になるのが, Floating
|exceptionは発生するものと考えて良いのかしら??

修正しました.doubleを返す関数のプロトタイプ宣言を忘れていた
ためです.昔のCならこれで良かったんですけどねえ.

Floating exceptionはrubyでは検出していません.ですからライブ
ラリによるというべきでしょう.ただし今回は変な値を元に計算し
たせいで出たものですけど.

|[3]
|B  array[bignum]
|
|これは意地悪なのですが, indexにbignumが使えません. いまのrubyの配列の
|実装では a[bignum] = foo は, メモリアロケーションの関係で無理だと思い
|まのでいいのかな...

これは仕様です.rubyは31bitの範囲内で収まる整数はFixnumに
変換しますから,Bignumであるということは20億以上の大きさがあ
る訳です.rubyの配列は疎ではありませんから,現実的に不可能で
すよね.

|ただ, もうちょっとましなエラーを出した方が...

エラーメッセージは変えました.

|[4] array[RANGE or idx, len] = array(size)

|array1[index, len] = array2
|
|の処理で, array2の長さが lenと同じ場合の処理に特別な対応をとっていない
|せいだと思うのですが, もうちょっと工夫していただけないでしょうか?

もっともです.修正しました.この例の場合ですといつでも(少し
だけ)高速になりました.

|[5] Array.new(size)
|
|[4]プログラムで コメントになっているところを置き換えて実行してみて下さ
|い. 落ちます!!

sizeを指定した時のメモリの初期化で間違っているところがありま
した.ごめんなさい.

|[6] Time

|Time.tv_secの様に絶対秒数(を計るメソッドはあるのですが, 絶対マイクロ秒
|を計るメソッドが用意してありません. ベンチマークとかする時には良く使う
|ので, 用意してもらえませんか?

絶対マイクロ秒か,intの範囲を越えてしまいますが,Bignumがあ
れば可能ですね.とはいえ,どういう名前にしましょうか.独自の
ものを導入する時にはいつも名前に悩むんですよね.

|あと, Timeには, tm構造体から月(tm_mon)を取り出すメソッドがないのですが... 
|なんか理由があるのですか?
|
|最後に, 時間の加減算をサポートして下さい. 

両方とも対応してます.ドキュメントに書き忘れていました.Time
の引き算はオペランドがTimeの時はその差分をFloatで,数値の時
にはその分だけ前の時間を返します.

                                まつもと ゆきひろ /:|)