< :前の番号
^ :番号順リスト
> :次の番号
P :前の記事
N :次の記事
|<:スレッドの先頭
>|:次のスレッド
^ :返事先
_:自分への返事
>:同じ返事先を持つ記事(前)
<:同じ返事先を持つ記事(後)
---:分割してスレッド表示、再表示
| :分割して(縦)スレッド表示、再表示
~ :スレッドのフレーム消去
.:インデックス
..:インデックスのインデックス
まつもと ゆきひろです.
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で,数値の時
にはその分だけ前の時間を返します.
まつもと ゆきひろ /:|)