98
matzり、終了!

次世代数値演算 ライブラリ Decimal という再発明の意義

Embed Size (px)

DESCRIPTION

rubykaigi2009 LT

Citation preview

Page 1: 次世代数値演算 ライブラリ Decimal という再発明の意義

matzり、終了!

Page 2: 次世代数値演算 ライブラリ Decimal という再発明の意義

次世代数値演算ライブラリ

Decimalという再発明の意義筑波大学 斎藤 匡

Page 3: 次世代数値演算 ライブラリ Decimal という再発明の意義

「Ruby逆引きレシピ」by Ruby札幌

Page 4: 次世代数値演算 ライブラリ Decimal という再発明の意義

「小数の計算」

Page 5: 次世代数値演算 ライブラリ Decimal という再発明の意義

拙作ライブラリDecimalが載っております

Page 6: 次世代数値演算 ライブラリ Decimal という再発明の意義

目の前のジュンク堂書店で売っています

Page 7: 次世代数値演算 ライブラリ Decimal という再発明の意義

「Ruby逆引きレシピ」by Ruby札幌

Page 8: 次世代数値演算 ライブラリ Decimal という再発明の意義

!買ってね!

Page 9: 次世代数値演算 ライブラリ Decimal という再発明の意義

Decimal

Page 10: 次世代数値演算 ライブラリ Decimal という再発明の意義

Decimal??

Page 11: 次世代数値演算 ライブラリ Decimal という再発明の意義

「任意精度小数演算

ライブラリ」

Page 12: 次世代数値演算 ライブラリ Decimal という再発明の意義

Floatより正確な小数の計算

Page 13: 次世代数値演算 ライブラリ Decimal という再発明の意義

でも

Page 14: 次世代数値演算 ライブラリ Decimal という再発明の意義

今日、俺は宣伝しに来たんじゃない

(建前)

Page 15: 次世代数値演算 ライブラリ Decimal という再発明の意義

前提

Page 16: 次世代数値演算 ライブラリ Decimal という再発明の意義

ソフトウェア

Page 17: 次世代数値演算 ライブラリ Decimal という再発明の意義

ソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェアソフトウェア

Page 18: 次世代数値演算 ライブラリ Decimal という再発明の意義

コモディティ

Page 19: 次世代数値演算 ライブラリ Decimal という再発明の意義

みんな「再発明」

Page 20: 次世代数値演算 ライブラリ Decimal という再発明の意義

より良い「再発明」のしかた

Page 21: 次世代数値演算 ライブラリ Decimal という再発明の意義

Decimalは「具体例」の一つ

Page 22: 次世代数値演算 ライブラリ Decimal という再発明の意義

一般的な「定理」を探りたい

↑目的(建前)

Page 23: 次世代数値演算 ライブラリ Decimal という再発明の意義

Decimal?? (2)

Page 24: 次世代数値演算 ライブラリ Decimal という再発明の意義

標準添付「BigDecimal」を作り直した感

じの何か

Page 25: 次世代数値演算 ライブラリ Decimal という再発明の意義

BigDecimalの再発明

Page 26: 次世代数値演算 ライブラリ Decimal という再発明の意義

“Better BigDecimal”↓

Decimal (ヲレヲレ)

Page 27: 次世代数値演算 ライブラリ Decimal という再発明の意義

何故?

Page 28: 次世代数値演算 ライブラリ Decimal という再発明の意義

二点

Page 29: 次世代数値演算 ライブラリ Decimal という再発明の意義

実装がダサい

Page 30: 次世代数値演算 ライブラリ Decimal という再発明の意義

設計がダサい

Page 31: 次世代数値演算 ライブラリ Decimal という再発明の意義

133,553vs

38,649

Page 32: 次世代数値演算 ライブラリ Decimal という再発明の意義

(1)

Page 33: 次世代数値演算 ライブラリ Decimal という再発明の意義

実装について。

Page 34: 次世代数値演算 ライブラリ Decimal という再発明の意義

BigDecimal:133,553 bytes

vsDecimal:

38,649 bytes

Page 35: 次世代数値演算 ライブラリ Decimal という再発明の意義

実装量の違い

Page 36: 次世代数値演算 ライブラリ Decimal という再発明の意義

約 3.5 倍コンパクト!!

Page 37: 次世代数値演算 ライブラリ Decimal という再発明の意義

何故?

Page 38: 次世代数値演算 ライブラリ Decimal という再発明の意義

再利用!

Page 39: 次世代数値演算 ライブラリ Decimal という再発明の意義

(原理はじめ)

Page 40: 次世代数値演算 ライブラリ Decimal という再発明の意義

そもそも

Page 41: 次世代数値演算 ライブラリ Decimal という再発明の意義

小数は整数の組で表せる

Page 42: 次世代数値演算 ライブラリ Decimal という再発明の意義

3.14

Page 43: 次世代数値演算 ライブラリ Decimal という再発明の意義

(314, 2)

Page 44: 次世代数値演算 ライブラリ Decimal という再発明の意義

「314」の「下から2桁」

に小数点

Page 45: 次世代数値演算 ライブラリ Decimal という再発明の意義

3.14159265358979

Page 46: 次世代数値演算 ライブラリ Decimal という再発明の意義

(314159265358979, 14)

Page 47: 次世代数値演算 ライブラリ Decimal という再発明の意義

(大きい整数 , 小さい整数)

Page 48: 次世代数値演算 ライブラリ Decimal という再発明の意義

小数の計算≒

整数の計算

Page 49: 次世代数値演算 ライブラリ Decimal という再発明の意義

(原理ここまで)

Page 50: 次世代数値演算 ライブラリ Decimal という再発明の意義

小さな整数

Page 51: 次世代数値演算 ライブラリ Decimal という再発明の意義

問題無し

Page 52: 次世代数値演算 ライブラリ Decimal という再発明の意義

大きな整数

Page 53: 次世代数値演算 ライブラリ Decimal という再発明の意義

がんばる必要

Page 54: 次世代数値演算 ライブラリ Decimal という再発明の意義

BigDecimalはどうしてる?

Page 55: 次世代数値演算 ライブラリ Decimal という再発明の意義

自前!

Page 56: 次世代数値演算 ライブラリ Decimal という再発明の意義

133,553 – 38,649 =94,904 ←ココ!

Page 57: 次世代数値演算 ライブラリ Decimal という再発明の意義

Decimalは?

Page 58: 次世代数値演算 ライブラリ Decimal という再発明の意義

大きな整数↓

Bignum

Page 59: 次世代数値演算 ライブラリ Decimal という再発明の意義

他人の褌!

Page 60: 次世代数値演算 ライブラリ Decimal という再発明の意義

副作用

Page 61: 次世代数値演算 ライブラリ Decimal という再発明の意義

安定・高速

Page 62: 次世代数値演算 ライブラリ Decimal という再発明の意義

いいことばっか

Page 63: 次世代数値演算 ライブラリ Decimal という再発明の意義

定理1再利用重要

Page 64: 次世代数値演算 ライブラリ Decimal という再発明の意義

設計について

Page 65: 次世代数値演算 ライブラリ Decimal という再発明の意義

x.sqrt

Page 66: 次世代数値演算 ライブラリ Decimal という再発明の意義

BigDecimalで平方根

Page 67: 次世代数値演算 ライブラリ Decimal という再発明の意義

普通sqrt(x)だろ jk

Page 68: 次世代数値演算 ライブラリ Decimal という再発明の意義

BigDecimal(”1.1”).to_s

Page 69: 次世代数値演算 ライブラリ Decimal という再発明の意義

#=> 0.11E1

Page 70: 次世代数値演算 ライブラリ Decimal という再発明の意義

“1.1” じゃないの?

Page 71: 次世代数値演算 ライブラリ Decimal という再発明の意義

Rails(ActiveSupport)

Page 72: 次世代数値演算 ライブラリ Decimal という再発明の意義

“1.1” になるよう上書き

Page 73: 次世代数値演算 ライブラリ Decimal という再発明の意義

違和感

Page 74: 次世代数値演算 ライブラリ Decimal という再発明の意義

Page 75: 次世代数値演算 ライブラリ Decimal という再発明の意義

使い辛さ

Page 76: 次世代数値演算 ライブラリ Decimal という再発明の意義

Decimalでは

Page 77: 次世代数値演算 ライブラリ Decimal という再発明の意義

sqrt(x) # 予定x.to_s # => “1.1”

Page 78: 次世代数値演算 ライブラリ Decimal という再発明の意義

自然

Page 79: 次世代数値演算 ライブラリ Decimal という再発明の意義

脳の互換性重要

Page 80: 次世代数値演算 ライブラリ Decimal という再発明の意義

定理2慣習重要

Page 81: 次世代数値演算 ライブラリ Decimal という再発明の意義

そのうえで

Page 82: 次世代数値演算 ライブラリ Decimal という再発明の意義

再発明が受け入れられるには

Page 83: 次世代数値演算 ライブラリ Decimal という再発明の意義

定理3シンプル

Page 84: 次世代数値演算 ライブラリ Decimal という再発明の意義

定理4速い

Page 85: 次世代数値演算 ライブラリ Decimal という再発明の意義

必要

Page 86: 次世代数値演算 ライブラリ Decimal という再発明の意義

シンプル

Page 87: 次世代数値演算 ライブラリ Decimal という再発明の意義

BigDecimal.instance_methods(false).sizevs

Decimal.instance_methods(false).size

Page 88: 次世代数値演算 ライブラリ Decimal という再発明の意義

50vs37

Page 89: 次世代数値演算 ライブラリ Decimal という再発明の意義

作る方も使う方も

Page 90: 次世代数値演算 ライブラリ Decimal という再発明の意義

スピード

Page 91: 次世代数値演算 ライブラリ Decimal という再発明の意義

ほとんどのケースで

数割〜数十倍以上

Page 92: 次世代数値演算 ライブラリ Decimal という再発明の意義

Decimalが高速

Page 93: 次世代数値演算 ライブラリ Decimal という再発明の意義

ということで

Page 94: 次世代数値演算 ライブラリ Decimal という再発明の意義

再利用慣習

シンプル速度

Page 95: 次世代数値演算 ライブラリ Decimal という再発明の意義

Decimalは「再発明」として

十分な価値をもった

Page 96: 次世代数値演算 ライブラリ Decimal という再発明の意義

再利用慣習

シンプル速度

Page 97: 次世代数値演算 ライブラリ Decimal という再発明の意義

Happy reinvention!

Page 98: 次世代数値演算 ライブラリ Decimal という再発明の意義

Decimalプロジェクト歌