思い付くまでタイトル未定

RubyとかRailsとかももクロちゃんとか色々な事書きます。

Rubyのsleepメソッドの戻り値が不思議。

プログラミング講座のテキストを作っていた時の出来事です。sleepメソッドの項目に来たので、どうやって書こうかなとググってみたら。。。

sleepメソッドは、休んだ時間数の整数が戻り値として返ってくる

と知りました。

モジュール:Kernel > クエリ:sleep | るりまサーチ

整数って事は、小数は四捨五入されるのかな?と思い調べてみました。

調べ方

  • Rubyのバージョン:ruby 2.2.1p85 (2015-02-26 revision 49769) [x64-mingw32]
  • irbを使う
  • sleep 0.1とかをひたすら打つ

途中経過

四捨五入だとしたら、sleep 1.52になるのかと思いきや、突然裏切られました。

    > sleep 1.5  
    => 1

でも、

    > sleep 1.6  
    => 2

あれ・・・?
じゃあ、1.5のどこかに分かれ目があるはず!

と思い、ちょこっとずつ数字を変えてみました。

そして、1.566741 あたりまで行った時、異変に気づきました。

    > sleep 1.566741  
    => 1

    > sleep 1.566741  
    => 2 

いままで、2回以上検証しなかった自分の甘さに落胆しました。
もしかしてと思って、何回も試していると規則性があったので検証してみます。

規則性の検証

github.com

上記のコードを使用。

  1. how_long_sleep?メソッドに小数timeを渡す。
  2. sleep time の戻り値を取得。
  3. 戻り値と time.to_i が等しい数justをカウント。
  4. 100回繰り返してjustがいくつになったか返す。

検証結果

time just time just time just
0 100 0 100 1 100
0.0 100 0.0 100 1.0 100
0.01 99 0.1 90 1.1 90
0.02 98 0.2 80 1.2 80
0.03 97 0.3 70 1.3 70
0.04 96 0.4 60 1.4 60
0.05 95 0.5 50 1.5 50
0.06 94 0.6 40 1.6 40
0.07 93 0.7 30 1.7 30
0.08 92 0.8 20 1.8 20
0.09 91 0.9 10 1.9 10

表が見辛い。。。(-"-;)

1秒台の検証でもsleep時間が100秒超えてしまうので、続きはあきらめました。

こういう規則性をなんというのでしたっけ。
忘れてしまいました。

グラフにするとこうでした。

f:id:kanahebiZ:20150709170024p:plain

    just = 100 - timeの小数 * 100

と言う感じでしょうか。仕様なのかな?これ。