観察日記 2010-02-16

Here comes a new committer!

mrkn さんがコミッタになりました。「bigdecimalの修正もお願いしますね。」

mvm comes to github

http://github.com/nobu/ruby
{hermit_} nobu's ruby at mvm - GitHub [text/html; charset=utf-8]

ビルドする拡張ライブラリを configure 時に指定

ruby-dev:40418 これってなんで --without-exts=... じゃなくて --with-exts=-... にしたのかな?
{znz_m} [ruby-dev:40418] [Feature #2746] ビルドする拡張ライブラリを configure 時に指定するための --with-exts オプション
--without-* は = で値を取れません

make EXTS=--without-ext=*dbm,tk でできるんだけど
毎回指定するのがめんどくさいってことかな
extmk.rbだと--with-extsじゃなくて--with-extensionsか--with-extだな

EXTS=+foo,-bar というのを考えたことがあるのを思い出した
ebanさんにダメ出しされたけど
それは何を意味してるんですか?
barを無効化
fooを必須化
ミニ言語は禁止

既に--with-ext(または--with-extensions)というものがあるのですが。
ext/extmk.rbあたりを参照してください。

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/40427

Float と Rational

1.div(0.2)

{mame} Fixnum#div coerces self and the given argument to Floats and returns self divided by other as Fixnum FAILED
{mame} Expected 4
{mame} to equal 5
こんなんとか大丈夫なのか?
spec 見てないけど
1.div(0.2).should == 5
環境の float の丸め方向に依存する?

1.div(0.2) が 4 になる環境があるんですね、浮動小数点って怖いですね。

Rational(13, 10)

1.3 == Rational(13, 10) #=> true
1.3.to_r == Rational(13, 10) #=> false
なんで前者が true になるんだろう
前者は Rational(13, 10) が to_f されるからですね
後者は IEEE754 なら Rational(5854679515581645, 4503599627370496) == Rational(13, 10) と等価

rational.to_f.to_i と rational.to_i

(Time.at(100) + -1.3).usec #=> 699999
なんで?って rubyspec の人に聞かれた
1.8 だと 700000 になる
ruby -e 'p ((100 - 1.3.to_r) % 1 * 100_000_000).to_i'
69999999
実際に行われている計算はこれですね
to_f してから to_i したら 70000000 になったので、Rational#to_i か

Rational#to_i

Rational#to_i は num.div(denom) なんだ
{mrkn} $ ruby -e 'p (1231453023109119921875.0 / 17592186044416)'
{mrkn} 70000000.0
{mrkn} $ ruby -e 'p (1231453023109119921875 / 17592186044416)'
{mrkn} 69999999
{mrkn} In[7]:= N[1231453023109119921875 / 17592186044416, 18]
{mrkn} Out[7]= 6.99999999999999956*10^7
17桁目で初めて9でなくなった

精度

これは、精度という考え方を啓蒙する前に Rational を組み込んでしまった弊害かなぁ
Float は殆どのアーキテクチャで53bitで打ち切られていて、to_s した時に表示されるものは libc が適切に丸めてくれたことでキリが良くなっているという事を認識してもらうしかないでしょうね
Rational が組み込みになったので、めでたく 1.3 は Rational(13, 10) の syntactic sugar になりました
であれば幸せだったのに
Rational(13, 10) のシンタックスシュガーにするなら 13/10 だと思う
測定誤差とか有効数字という概念は本体には組み込まない
そのためには Real クラスが必要になってしまうんですよ
Real 作りたいなぁ
全員に http://docs.sun.com/source/806-3568/ncg_goldberg.html これ読ませたい
{hermit_} What Every Computer Scientist Should Know About Floating-Point Arithmetic [text/html]

Precision

2.0までにexact? inexact? の話をするとして、とりあえずPrecisionは削ったのでしたと。
Precision というクラスは必要かなぁ
inexact な数が自分で有効桁数と全長を持っていれば良い気がしている

Precision は 1.8 にはあったが 1.9 で削除された組み込みモジュールです。

πは分数にすると

Math::PI は Rational(22, 7) くらいで
335/113 だったかな
355/113 だった
113355を真ん中で区切ると覚える

Rubyの終了処理とファイナライザ

[ruby-dev:40382] の話経由、[ruby-dev:40431] の 2. 行き

http://www.ruby-lang.org/ja/man/html/_BDAACEBBBDE8CDFD.html に終了処理でファイナライザが呼ばれると明記してあった
おお
やっぱ self-referencial だから呼ばないというのが良くない
なので、tempfileが消えないのはバグ
で、mameさんパッチが仕様にもっとも忠実だとおもう
上のリンクではファイナライザ呼ぶとは書いてあるが、ゾンビにするとは書いてないのだし
mameさんパッチでrubyspecを直しているのは、どういう挙動を仮定していたのを、どういう仮定に直しているのでしょうか?
「self-referencial なファイナライザは実行されない」→「self-referncial なファイナライザも実行される」にする予定
ただしい
仕様にそう書いてあるじゃん。といえる
あの怪しいマニュアルより rubyspec の方がまだ正しい可能性がありそうだけど (ぉ
ひどい > rubyspecのほうが
で、ほんとにあやしいの? >まにゅある

旧マニュアルのベースを書いたのはまつもとさんだったと思うけれど、Wiki なので、「終了処理でファイナライザが呼ばれる」を誰が書いたかは不明