rubyをたのしくするために私が考えていること

97
Rubyをたのしく するために私が考 えていること 村田賢太 Hokuriku.rb × 高専カンファレンス 2011.03.20 1 2011320日日曜日

Upload: kenta-murata

Post on 05-Jul-2015

4.157 views

Category:

Education


10 download

DESCRIPTION

2011.03.20 に開催された Hokuriku.rb x 高専カンファレンス で使用した発表資料です。

TRANSCRIPT

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日日曜日