けいじゅ@SHLジャパンです. 

昔話題になった Sortorを作っていて幾つかバグと変なのを見つけました. あ
と, リクエストが少しあります.

[1] print 10000000000000000000000 - 10000000000000000000001

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

[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は発生するものと考えて良いのかしら??

[3]
B  array[bignum]

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

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

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

クイックソートの最適化のために, 挿入ソートを作っていておかしい現象を発
見しました.

以下のプログラムを見て下さい:

$stdout.sync = TRUE

def utime
  t = Time.new
  t.tv_sec * 1000000 + t.tv_usec
end

1000.times do
  |time|
  size = 2**time
  printf "Time: %d Size: %d ", time, size
  
#  a = Array.new(size)
#  b = Array.new(size)
  a = Array.new
  b = Array.new
  0.upto(size - 1) do
    |i|
    a[i] = rand(size)
    b[i] = rand(size)
  end
  
  t1 = utime
  a[0..[a.size - 1, 30].min] = b[0..[a.size - 1, 30].min]
  t2 = utime
  0.upto([size - 1, 30].min) do
    |i|
    a[i] = b[i]
  end
  t3 = utime
  
  printf "%d, %d, %d\n", t2 - t1, t3 - t2, t3 - t2 - (t2 - t1)

end

上記プログラムのメインの処理は以下のように配列のコピー操作を行なうとこ
ろです. 大きな配列の一部分に上書き(サイズ30)を行なっています.

(1)
  a[0..[a.size - 1, 30].min] = b[0..[a.size - 1, 30].min]

(2)
  0.upto([size - 1, 30].min) do
    |i|
    a[i] = b[i]
  end

(2)の処理は, aのサイズに関係なく一定なのですが, (1)の処理は段々遅くなっ
ていき, size == 32768で処理速度が逆転してしまいます.

たぶん

array1[index, len] = array2

の処理で, array2の長さが lenと同じ場合の処理に特別な対応をとっていない
せいだと思うのですが, もうちょっと工夫していただけないでしょうか?
  
[5] Array.new(size)

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

# そういえば, メッセージが変わりましたね. 良くわかるようになりました.
# (^^;;;

[6] Time

これはリクエストです.

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


あと, Timeには, tm構造体から月(tm_mon)を取り出すメソッドがないのですが... 
なんか理由があるのですか?

最後に, 時間の加減算をサポートして下さい. 

__
.........................................石塚 圭樹@SHLジャパン(株)...
------------>アドレス変わりました!! e-mail: keiju / shljapan.co.jp <----