Rubyをたのしくするために私が考えていること村田賢太
Hokuriku.rb × 高専カンファレンス2011.03.20
12011年3月20日日曜日
自己紹介
222011年3月20日日曜日
村田賢太 mrkn 苫小牧市生まれ 札幌市在住 Ruby コミッタ Ruby 札幌 高専カンファレンス実行委員会副代表 趣味: 数学, 科学全般 (特に物理学)
332011年3月20日日曜日
’81 出生’97 苫小牧高専情報工学科’00 Kondara Project (Linux distribution の開発)’02 旭川高専専攻科生産システム工学専攻’04 北大大学院情報科学研究科 修士課程’06 同 博士後期課程’09 現職’10 Ruby コミッタ
442011年3月20日日曜日
小4 MSX-BASIC小6 Z80, Forth中2 C (読書)情1 C++, Java, HTML, JavaScript情2 Perl, EmacsLisp情3 TeX, sh, XML情4 Ruby, SQL情5 (Python, PHP)
MSX 期
Windows 期
Linux 期
552011年3月20日日曜日
Ruby をはじめたきっかけ
662011年3月20日日曜日
Kondara Project の開発ツール群が Ruby で実装されていたから
772011年3月20日日曜日
Kondara Project に入ったきっかけ
882011年3月20日日曜日
TeX の RPM パッケージの patch を何度も投げていたら、いつのまにかメンバーだった
992011年3月20日日曜日
Ruby コミッタになったきっかけ
10102011年3月20日日曜日
Ruby の patch を書いて投げたり、MLで議論に参加したりを何度かやっていたらコミット権が与えられた
11112011年3月20日日曜日
中の人になってみて分かったこと
12122011年3月20日日曜日
OSSプロジェクトは基本的に人材不足
13132011年3月20日日曜日
何度も役立ってる人は望まずとも誘われる
14142011年3月20日日曜日
自己紹介終わり
15152011年3月20日日曜日
大事なこと
16162011年3月20日日曜日
172010年3月1日月曜日 172011年3月20日日曜日
Ruby 会議 2011CFP deadline2011.03.27
http://rubykaigi.org/2011
18182011年3月20日日曜日
では本題へ
19192011年3月20日日曜日
Rubyをたのしくするために私が考えていること村田賢太
Hokuriku.rb × 高専カンファレンス2011.03.20 20202011年3月20日日曜日
Rubyをよりたのしくするために
•小数リテラルを浮動小数点数ではなく有理数にする
•すべての数値に精度を持たせる
21212011年3月20日日曜日
話の流れ
•たのしさとは?
•Ruby の数値
•小数を改善する理由
22222011年3月20日日曜日
Ruby はたのしい
23232011年3月20日日曜日
Ruby はなぜたのしい?
24242011年3月20日日曜日
たのしい理由はよく分からない
25252011年3月20日日曜日
説明できないけど、Rubyがたのしいことは経験的事実
26262011年3月20日日曜日
Ruby をもっとたのしくするにはどうしたら良いだろう?
27272011年3月20日日曜日
プロダクティブな活動
28282011年3月20日日曜日
たのしい作業
つまらない作業
29292011年3月20日日曜日
プロダクティブな活動をよりたのしくするにはどうしたら良いか?
30302011年3月20日日曜日
たのしい作業の割合を増やせば良い
31312011年3月20日日曜日
つまらない作業をたのしく感じられるようにがんばる!?
32322011年3月20日日曜日
つまらない理由
•難しくて理解できない
•同じ事の繰り返しで飽きる
•単純すぎて面白くない
•そもそも興味を持てない33
332011年3月20日日曜日
つまらない作業をたのしく感じられるようにするのは困難
34342011年3月20日日曜日
つまらない作業の絶対量を減らす
35352011年3月20日日曜日
【例】プログラムの
コンパイル待ち時間
36362011年3月20日日曜日
第一段階
コンパイル→リンクの過程を手作業で実施
37372011年3月20日日曜日
非常に単調とても面倒
38382011年3月20日日曜日
第二段階
Makefile を作成make を手動で起動あとは make に一任
39392011年3月20日日曜日
プログラムをコンパイルする理由
•プログラムの構文エラーを見付けるため
•実行してバグを探すため
40402011年3月20日日曜日
欲しいものはコンパイル後に
手に入る
41412011年3月20日日曜日
結局待ち時間が減らないので、つまらなさはあまり減ってない
42422011年3月20日日曜日
第三段階
スクリプト言語コンパイル過程を隠蔽必要なら JIT コンパイル
43432011年3月20日日曜日
つまらなく感じる瞬間を減らし、たのしく感じられる時間を増やす
44442011年3月20日日曜日
能率が上がってもっとたのしくなる
45452011年3月20日日曜日
以上を踏まえてRuby の数値について
見てみる
46462011年3月20日日曜日
なぜ数値?
誰かに頼まれたの?
47472011年3月20日日曜日
村田賢太 mrkn 苫小牧市生まれ 札幌市在住 Ruby コミッタ Ruby 札幌 高専カンファレンス実行委員会副代表 趣味: 数学, 科学全般 (特に物理学)
48482011年3月20日日曜日
Ruby の数値系
Numeric Integer 整数 Fixnum 固定長整数 Bignum 多倍長整数 Float 固定長浮動小数点数 Rational 有理数 Complex 複素数
↑ココに注目!
49492011年3月20日日曜日
プログラミングの世界で “小数” と言えば固定長浮動小数点数を指す
50502011年3月20日日曜日
本当に?
51512011年3月20日日曜日
歴史
52522011年3月20日日曜日
過去のコンピュータ
•ただの計算機だった
•科学技術計算が主な用途だった
•記憶容量はとても少なかった
•CPUはとても遅かった53
532011年3月20日日曜日
現在のコンピュータ
•あらゆる用途に使われる
•記憶容量は大量にある
•CPUは超速い
•しかも並行処理ができる54
542011年3月20日日曜日
過去の常識↓
現在の非常識
55552011年3月20日日曜日
小数といえば固定長浮動小数点数
は今も成立する?56
562011年3月20日日曜日
No
57572011年3月20日日曜日
固定長浮動小数点数は数値計算のための
データ型
58582011年3月20日日曜日
FPUとALUをフル稼動させて大規模な計算を実施するために必要
59592011年3月20日日曜日
スクリプト言語で固定長浮動小数点数をオブジェクトとして扱えてもあまり嬉しくない
60602011年3月20日日曜日
Rubyのような動的型付け言語ではデータフローに基づく最適化が難しいため、Floatオブジェクトを直接扱える事の優位性は無い
61612011年3月20日日曜日
Floatよりも、固定長浮動小数点数のベクトルを扱える方が、数値計算向きには嬉しい
62622011年3月20日日曜日
Rubyで小数を単体で使う大多数の人は
“ふつうの小数”を使いたいはず
63632011年3月20日日曜日
プログラム中に小数リテラルが出てきたら “ふつうの小数” として扱ってあげたい
64642011年3月20日日曜日
小数リテラルが Float オブジェクトになってはならない
65652011年3月20日日曜日
なぜなら、Float (固定長浮動小数点数) は普通の小数ではないから
66662011年3月20日日曜日
Floatと普通の小数の違い
•Floatは固定長である
•Floatは (常に) 誤差を持つ
•Floatはほとんどの10進小数を正確に表現できない
67672011年3月20日日曜日
浮動小数点数の構造
s e m05263
11 bits 52 bits
IEEE754 倍精度数の場合
正規化数
53bits 精度を維持するために最上位ビットを1にする
以後、面倒なのでこの3つは無視
68682011年3月20日日曜日
Float が誤差を持つ例
たとえば10進法の 0.1 を変換すると・・・
0.1 = (0.0001100011...)2“00011” が繰り返す循環小数になる。
0.1 を Float に変換すると循環小数が52-bit目で打ち切られてしまう!
1.1000110001...100011000110 × 2‒4
↑正規化
69692011年3月20日日曜日
その他の可能性
•指数が大きな数と指数が小さな数を加減算する場合
•指数が同程度の数同士の除算
70702011年3月20日日曜日
計算過程で誤差を含む可能性がある
71712011年3月20日日曜日
浮動小数点数は“常に” 誤差を含んでいると
考えたほうが良い72
722011年3月20日日曜日
むしろ、浮動小数点数は数ではなく “区間” であると考えるべき
73732011年3月20日日曜日
ある浮動小数点数 f に加えても、f を変化させない、非零の数εが存在する
74742011年3月20日日曜日
この数は52-bitで打ち切ると消える
となる全ての について
が成立する。
75752011年3月20日日曜日
この開区間の中なら何処をとっても浮動小数点数としては同値
76
ただの代表値
762011年3月20日日曜日
浮動小数点数は数ではなく “区間” であると考えるべき
77772011年3月20日日曜日
対応する区間の長さが、その浮動小数点数に含まれる可能性のある誤差の最大値
78782011年3月20日日曜日
一方、人々がふつうに期待する小数は誤差を含まない
79792011年3月20日日曜日
プログラム中に “1.2” と書いた人は、
1.2 ±εではなく真の 1.2 を期待している
80802011年3月20日日曜日
“ふつうの小数” だと思い込んで浮動小数点数を使うと、計算結果が予測不能になる
81812011年3月20日日曜日
Ruby は多くの人の期待に応えたほうが良いと私は考える
82822011年3月20日日曜日
小数リテラルはFloatではなくRationalのインスタンスにすべき
83832011年3月20日日曜日
近い将来、この変更に関する patch を提案し、遅くとも Ruby 2.0 のリリースまでに取り込みたい
84842011年3月20日日曜日
ところで
85852011年3月20日日曜日
10進小数のうち、0.1 のように2進小数へ変換すると循環小数になってしまうものはどのくらい存在するか?
86862011年3月20日日曜日
計算してみましょう
87872011年3月20日日曜日
その前に準備
88882011年3月20日日曜日
一般化
一般化
89
小数とその分数形式
892011年3月20日日曜日
の形にできれば有限桁の2進小数で表わせるので、
と 約分できれば、元の10進小数は2進小数で正確に表現できる。そのためには、分子が 5m で割り切れることが必要条件となる (∵ 10 = 2×5 )。
90902011年3月20日日曜日
従って分子について次式を満たす自然数 D の存在が条件となる:
より なのでm桁の10進小数のうち2進小数として正確に表現できるものは 2m 個存在する。
これは、m桁の10進小数全体のうちのたった 1/5m の割合である。
91912011年3月20日日曜日
Plot��1 � 5^��m�, 5^��m��, �m, 0, 16��Input interpretation:
plot1� 5�m
5�mm � 0 to 16
Plot:
5 10 15
0.2
0.4
0.6
0.8
1.0
1�5�m
5�m
Generated by Wolfram|Alpha (www.wolframalpha.com) on March 19, 2011 from Champaign, IL.© Wolfram Alpha LLC—A Wolfram Research Company
1
2進法で不正確になる小数の割合
2進法でも正確な小数の割合
横軸: 10進法での桁数 m
IEEE754 倍精度数の最大精度
92
00
922011年3月20日日曜日
ほぼすべての10進小数は2進法で正確に表現できないと考えたほうが良い
93932011年3月20日日曜日
有理数 (Rational) を使うなら、こんな事を心配する必要はない
94942011年3月20日日曜日
小数リテラルはFloatではなくRationalのインスタンスにすべき
95952011年3月20日日曜日
まとめ
96962011年3月20日日曜日
•固定長浮動小数点数は “ふつうの小数” ではない
•2進法の固定長浮動小数点数は “ふつうの小数” を正確に表現できない
•Ruby の小数リテラルは Rational として解釈したほうが良い
97972011年3月20日日曜日