SlideShare a Scribd company logo
詳解! Decimal

筑波大学情報科学類科目等履修生・Tsukuba.rb

         斎藤ただし
非常に軽い自己紹介

    ←ぎだがんどぅ→




1    なう!       2

群馬  栃木  茨城
感慨深い
多倍長十進小数演算ライブラリ

    Decimal
Decimalとは何か?
●   斎藤が書き起こしたプロダクト
●   多倍長十進小数演算ライブラリ
    ●   ふつうの小数を好きな長さだけ計算できる
    ●   組み込みのFloatを補う
●   Ruby標準添付ライブラリBigDecimalの後継を
    目指す
    ●   シンプル・高速・使いやすい・正確

                  decimal.rubyforge.org
Floatは不正確! (1/2)
●   超FAQ
    x = 0.0
    10.times { x += 0.1 }
    x == 1.0 #=> false!?
    ●   何度「バグ報告」されてるか分からない
    ●   例えば
        http://redmine.ruby-lang.org/issues/show/4394
    ●   “Learn floating point numbers. What Every
        Computer Scientist Should Know About Floating-
        Point Arithmetic ...” by @nalsh
                         decimal.rubyforge.org
Floatは不正確! (2/2)
●   10進小数が有限桁の2進小数で表現できる条件
    by @mrkn
    ●   http://d.hatena.ne.jp/mrkn/20110223
    ●   n 桁の10進小数は、それを10m倍して5nの倍数にで
        きるような自然数m≧nが存在するとき、有限桁の
        2進小数で表現できる
    ●   0.1は、0.1 * 10 = 1 が 51 の倍数ではないので有限
        桁の2進小数で表現できない
●   → 十進小数演算ライブラリの存在意義
                         decimal.rubyforge.org
Decimalとは何でないか?
●   無限の長さの小数を計算
    ●   「1 / 3」の結果は正確に保持できない
    ●   桁数が有限なのはFloatと一緒、あくまでも「可能
        な限りの(任意の)長さ」
●   BigDecimalができない事ができる画期的なもの
    ●   あくまでより良い再発明



                 decimal.rubyforge.org
っていうか何で
そんなことやってるの?



ちょっと俺の身の上話を
  聞いてくださいよ



    decimal.rubyforge.org
π

decimal.rubyforge.org
小学生
●   5年生の授業参観日、算数
●   円周率 π に出会う (人生初の無理数)
●   先生「…という風に、ずっとに続いていきま
    す。」
●   俺「全部調べた事もないのに、なんで分かる
    の?」
●   先生「大きくなったら、スウガクを勉強してく
    ださい。」
             decimal.rubyforge.org
「大きくなったら、スウガクを
  勉強してください。」



     decimal.rubyforge.org
根に持ってしまった。



   decimal.rubyforge.org
中学生
●   C言語に出会う
●   当然 π を計算!
●   ……あれ?
    ●   何百桁も計算してるはずなのに出てこない
    ●   ていうか途中から間違ってるし
●   C言語の小数は「固定長」だった!
●   代わりに「多倍長整数」に出会う
    ●   手元で実装したり
                   decimal.rubyforge.org
高校生
●   多倍長「整数」の計算に必要な数式を組み立て
    ては崩し
●   「いくらでも長い整数」が扱えれば「いくらで
    も長い小数」も扱えるんじゃ?
●   AO入試で逆質問
    ●   先生「んなの簡単」
    ●   俺「???」
●   Rubyに出会う     (Ruby本の出る出る詐欺未遂事件)
                   decimal.rubyforge.org
大学生
●   Rubyにちょっかいを出し始める
●   1.8リリース、標準添付ライブラリ拡大路線
●   BigDecimalが飛び込んできた!!!
●   ソースを読んだり、数式で悩んだり
●   ようやく「いくらでも長い小数」を計算できる
    原理を理解


                decimal.rubyforge.org
BigDecimalのAPIにちょっかい
●   2003年、1.8.0リリースの直前
●   前身のBigFloatとは違う性質
●   なのに代わり映えしないAPI(メソッド群)
●   Numeric全般も気にしないオレオレAPI
●   →だいぶ変えてもらいました
●   →まだ不満
●   →ほぼそのまま現在に至る(1.9.2)
              decimal.rubyforge.org
身の上をまとめると
●   π を計算したかった
●   BigDecimalには不満があった
●   →なら新しく作っちゃえばいいじゃない
●   = Decimal !
    ●   Decimal::Math.pi(n) #=> 小数点以下n桁のπ!




                      decimal.rubyforge.org
Decimal
設計上の工夫


  decimal.rubyforge.org
設計上の工夫
●   APIは最小限に
●   既存クラスとの親和性を高く
●   厳密さを保つ




               decimal.rubyforge.org
APIは最小限に
●   オレオレAPIはいらない
    ●   クラスメソッド5個、インスタンスメソッド13個減
●   「多倍長」「十進」を生かすものは残す
    ●   d = Decimal(“1.23”)
        d.round(1, :up) #=> Decimal(1.3)
●   必要になったら後から入れる
    ●   後から「消す」のは大変だよね


                         decimal.rubyforge.org
既存クラスとの親和性を高く
●   Rubyの数なんだからNumeric
●   「小数」なんだから「だいたいFloat」
●   Float・他のNumericのメソッドと同じ名前では
    同じ動作
●   Floatを返すMath.functionも
    Decimal::Math.functionとして実装
    ●   sinとかsqrtとかlogとか
    ●   Floatと違い、何桁でも計算できます
                    decimal.rubyforge.org
厳密さを保つ
●   BigDecimalはFloatとの「自然な」演算が有効
    ●   BigDecimal(“1.23”) + 0.1 #=> 通っちゃう…不正確!
●   Decimalはプログラマが精度を明示しない限り
    厳密さを保つ
●   Floatとの演算を軒並みエラーに
    ●   不正確さを明示
    ●   どうしても一緒にしたいときはDecimal#to_fして
        ください
                      decimal.rubyforge.org
Decimal
実装上の工夫


  decimal.rubyforge.org
実装上の工夫
●
    コード再利用
●
    省メモリ




             decimal.rubyforge.org
その前に
「多倍長十進小数」の
  内部構造の復習

   decimal.rubyforge.org
RubyKaigi2009…




    decimal.rubyforge.org
そもそも
小数は
整数の組
で表せる
3.14
(314, 2)
「314」の
「下から2桁目」
  に小数点
3.14
もっと長い小数でも
3.14159265358979
(314159265358979, 14)
(大きい整数, 小さい整数)
小数の計算
  ≒
整数の計算
復習終わり



 decimal.rubyforge.org
実装上の工夫
●
    コード再利用
●
    省メモリ




             decimal.rubyforge.org
コード再利用 (1/2)
●   BigDecimalは「大きい整数」を自前で実装
●   それってBignumでよくない?
●   →やったらあっさりできた
    ●   C API: rb_big_plus(), rb_big_mul(), …
●   135,334 バイト (BigDecimal)
    vs 59,706 バイト (Decimal)
    ●   55%以上の小型化
●   しかも速いし (e.g. 1.9.1 → 1.9.2)
                         decimal.rubyforge.org
コード再利用 (2/2)
●
    つまり
    ●
        実装のコンパクト化
    ●
        高速化
●
    同時に達成!
    ●
        B-)




                  decimal.rubyforge.org
省メモリ (1/2)
●
    BigDecimal インスタンス本体
     typedef struct {

                                    ← いらない
         VALUE obj;
         U_LONG MaxPrec;
         U_LONG Prec;
         S_INT exponent;
         short sign;
         short flag;
         U_LONG frac[1];
     } Real;




                           decimal.rubyforge.org
省メモリ (2/2)
●
    我がDecimal インスタンス本体

     typedef struct {
         VALUE inum;
         long scale;
     } Decimal;




●
    スッキリ!


                        decimal.rubyforge.org
という感じで
●   いろいろがんばりました
●   Ruby Summer of Codeに採択&完走、賞金$5000!




●   /(^o^)\
                 decimal.rubyforge.org
まとめ
●   Decimalはふつうの小数をふつうに計算するた
    めのライブラリです
●   既存のBigDecimalよりおいしいです (^p^
●   使ってやってください m(_ _)m




               decimal.rubyforge.org

More Related Content

What's hot

templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
MITSUNARI Shigeo
 
5分で分かる自己組織化マップ
5分で分かる自己組織化マップ5分で分かる自己組織化マップ
5分で分かる自己組織化マップ
Daisuke Takai
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介
Akira Tanaka
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
PSR-1 と PSR-2 を 5分でざっくり理解する
PSR-1 と PSR-2 を5分でざっくり理解するPSR-1 と PSR-2 を5分でざっくり理解する
PSR-1 と PSR-2 を 5分でざっくり理解する
Wataru Terada
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
 
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
UnityTechnologiesJapan002
 
ゼロから始める転移学習
ゼロから始める転移学習ゼロから始める転移学習
ゼロから始める転移学習
Yahoo!デベロッパーネットワーク
 
REST APIに入門する。
REST APIに入門する。REST APIに入門する。
REST APIに入門する。
Kazushi Kawamura
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Yasutaka Kawamoto
 
View customize1.2.0の紹介
View customize1.2.0の紹介View customize1.2.0の紹介
View customize1.2.0の紹介
onozaty
 
モデルアーキテクチャ観点からのDeep Neural Network高速化
モデルアーキテクチャ観点からのDeep Neural Network高速化モデルアーキテクチャ観点からのDeep Neural Network高速化
モデルアーキテクチャ観点からのDeep Neural Network高速化
Yusuke Uchida
 
目指せグラフマスター
目指せグラフマスター目指せグラフマスター
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
 
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!
amusementcreators
 
2次元/3次元幾何学変換の統一的な最適計算論文
2次元/3次元幾何学変換の統一的な最適計算論文2次元/3次元幾何学変換の統一的な最適計算論文
2次元/3次元幾何学変換の統一的な最適計算論文doboncho
 

What's hot (20)

templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
5分で分かる自己組織化マップ
5分で分かる自己組織化マップ5分で分かる自己組織化マップ
5分で分かる自己組織化マップ
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
PSR-1 と PSR-2 を 5分でざっくり理解する
PSR-1 と PSR-2 を5分でざっくり理解するPSR-1 と PSR-2 を5分でざっくり理解する
PSR-1 と PSR-2 を 5分でざっくり理解する
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
 
ゼロから始める転移学習
ゼロから始める転移学習ゼロから始める転移学習
ゼロから始める転移学習
 
REST APIに入門する。
REST APIに入門する。REST APIに入門する。
REST APIに入門する。
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
 
View customize1.2.0の紹介
View customize1.2.0の紹介View customize1.2.0の紹介
View customize1.2.0の紹介
 
モデルアーキテクチャ観点からのDeep Neural Network高速化
モデルアーキテクチャ観点からのDeep Neural Network高速化モデルアーキテクチャ観点からのDeep Neural Network高速化
モデルアーキテクチャ観点からのDeep Neural Network高速化
 
目指せグラフマスター
目指せグラフマスター目指せグラフマスター
目指せグラフマスター
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!
 
2次元/3次元幾何学変換の統一的な最適計算論文
2次元/3次元幾何学変換の統一的な最適計算論文2次元/3次元幾何学変換の統一的な最適計算論文
2次元/3次元幾何学変換の統一的な最適計算論文
 

Viewers also liked

高校生のためのソーシャルメディア活用術20131122
高校生のためのソーシャルメディア活用術20131122高校生のためのソーシャルメディア活用術20131122
高校生のためのソーシャルメディア活用術20131122義広 河野
 
次世代数値演算 ライブラリ Decimal という再発明の意義
次世代数値演算 ライブラリ Decimal という再発明の意義次世代数値演算 ライブラリ Decimal という再発明の意義
次世代数値演算 ライブラリ Decimal という再発明の意義
Tadashi Saito
 
Learning to automatically solve algebra word problems
Learning to automatically solve algebra word problemsLearning to automatically solve algebra word problems
Learning to automatically solve algebra word problems
Naoaki Okazaki
 
Rubyと電子出版 (TokyuRubyKaigi02)
Rubyと電子出版 (TokyuRubyKaigi02)Rubyと電子出版 (TokyuRubyKaigi02)
Rubyと電子出版 (TokyuRubyKaigi02)masayoshi takahashi
 
FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向
Shinya Takamaeda-Y
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
Masahiro Sakai
 
How a CDCL SAT solver works
How a CDCL SAT solver worksHow a CDCL SAT solver works
How a CDCL SAT solver works
Masahiro Sakai
 

Viewers also liked (7)

高校生のためのソーシャルメディア活用術20131122
高校生のためのソーシャルメディア活用術20131122高校生のためのソーシャルメディア活用術20131122
高校生のためのソーシャルメディア活用術20131122
 
次世代数値演算 ライブラリ Decimal という再発明の意義
次世代数値演算 ライブラリ Decimal という再発明の意義次世代数値演算 ライブラリ Decimal という再発明の意義
次世代数値演算 ライブラリ Decimal という再発明の意義
 
Learning to automatically solve algebra word problems
Learning to automatically solve algebra word problemsLearning to automatically solve algebra word problems
Learning to automatically solve algebra word problems
 
Rubyと電子出版 (TokyuRubyKaigi02)
Rubyと電子出版 (TokyuRubyKaigi02)Rubyと電子出版 (TokyuRubyKaigi02)
Rubyと電子出版 (TokyuRubyKaigi02)
 
FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
How a CDCL SAT solver works
How a CDCL SAT solver worksHow a CDCL SAT solver works
How a CDCL SAT solver works
 

Similar to 詳解! Decimal

Tottoruby 20130119
Tottoruby 20130119Tottoruby 20130119
Tottoruby 20130119
Takashi SAKAGUCHI
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
mitim
 
Hacking Ruby with Python
Hacking Ruby with PythonHacking Ruby with Python
Hacking Ruby with Python
Taisuke Yamada
 
20180830 implement dqn_platinum_data_meetup_vol1
20180830 implement dqn_platinum_data_meetup_vol120180830 implement dqn_platinum_data_meetup_vol1
20180830 implement dqn_platinum_data_meetup_vol1
Keisuke Nakata
 
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeコマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeKiwamu Okabe
 
C#/.NETがやっていること 第二版
C#/.NETがやっていること 第二版C#/.NETがやっていること 第二版
C#/.NETがやっていること 第二版
信之 岩永
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~CHY72
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 
C++ template-primer
C++ template-primerC++ template-primer
C++ template-primer
Kohsuke Yuasa
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章Tomonobu_Hirano
 
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行monglee
 
Numeric クラスについて
Numeric クラスについて Numeric クラスについて
Numeric クラスについて Tomoya Kawanishi
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
 
ICFP2009-いかにして我々は戦ったか
ICFP2009-いかにして我々は戦ったかICFP2009-いかにして我々は戦ったか
ICFP2009-いかにして我々は戦ったか
ina job
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
Yoshifumi Yamaguchi
 
コードの複雑さを測ろう
コードの複雑さを測ろうコードの複雑さを測ろう
コードの複雑さを測ろうShinya_131
 
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
Isaac Mathis
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
yushin_hirano
 

Similar to 詳解! Decimal (20)

Tottoruby 20130119
Tottoruby 20130119Tottoruby 20130119
Tottoruby 20130119
 
Clojure
ClojureClojure
Clojure
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
Hacking Ruby with Python
Hacking Ruby with PythonHacking Ruby with Python
Hacking Ruby with Python
 
20180830 implement dqn_platinum_data_meetup_vol1
20180830 implement dqn_platinum_data_meetup_vol120180830 implement dqn_platinum_data_meetup_vol1
20180830 implement dqn_platinum_data_meetup_vol1
 
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeコマンドライン使いもLibreOffice
コマンドライン使いもLibreOffice
 
C#/.NETがやっていること 第二版
C#/.NETがやっていること 第二版C#/.NETがやっていること 第二版
C#/.NETがやっていること 第二版
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
C++ template-primer
C++ template-primerC++ template-primer
C++ template-primer
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
 
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
 
Numeric クラスについて
Numeric クラスについて Numeric クラスについて
Numeric クラスについて
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
ICFP2009-いかにして我々は戦ったか
ICFP2009-いかにして我々は戦ったかICFP2009-いかにして我々は戦ったか
ICFP2009-いかにして我々は戦ったか
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
 
コードの複雑さを測ろう
コードの複雑さを測ろうコードの複雑さを測ろう
コードの複雑さを測ろう
 
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
 

Recently uploaded

【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 

Recently uploaded (16)

【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 

詳解! Decimal

  • 2. 非常に軽い自己紹介 ←ぎだがんどぅ→ 1 なう! 2 群馬  栃木  茨城
  • 5. Decimalとは何か? ● 斎藤が書き起こしたプロダクト ● 多倍長十進小数演算ライブラリ ● ふつうの小数を好きな長さだけ計算できる ● 組み込みのFloatを補う ● Ruby標準添付ライブラリBigDecimalの後継を 目指す ● シンプル・高速・使いやすい・正確 decimal.rubyforge.org
  • 6. Floatは不正確! (1/2) ● 超FAQ x = 0.0 10.times { x += 0.1 } x == 1.0 #=> false!? ● 何度「バグ報告」されてるか分からない ● 例えば http://redmine.ruby-lang.org/issues/show/4394 ● “Learn floating point numbers. What Every Computer Scientist Should Know About Floating- Point Arithmetic ...” by @nalsh decimal.rubyforge.org
  • 7. Floatは不正確! (2/2) ● 10進小数が有限桁の2進小数で表現できる条件 by @mrkn ● http://d.hatena.ne.jp/mrkn/20110223 ● n 桁の10進小数は、それを10m倍して5nの倍数にで きるような自然数m≧nが存在するとき、有限桁の 2進小数で表現できる ● 0.1は、0.1 * 10 = 1 が 51 の倍数ではないので有限 桁の2進小数で表現できない ● → 十進小数演算ライブラリの存在意義 decimal.rubyforge.org
  • 8. Decimalとは何でないか? ● 無限の長さの小数を計算 ● 「1 / 3」の結果は正確に保持できない ● 桁数が有限なのはFloatと一緒、あくまでも「可能 な限りの(任意の)長さ」 ● BigDecimalができない事ができる画期的なもの ● あくまでより良い再発明 decimal.rubyforge.org
  • 11. 小学生 ● 5年生の授業参観日、算数 ● 円周率 π に出会う (人生初の無理数) ● 先生「…という風に、ずっとに続いていきま す。」 ● 俺「全部調べた事もないのに、なんで分かる の?」 ● 先生「大きくなったら、スウガクを勉強してく ださい。」 decimal.rubyforge.org
  • 13. 根に持ってしまった。 decimal.rubyforge.org
  • 14. 中学生 ● C言語に出会う ● 当然 π を計算! ● ……あれ? ● 何百桁も計算してるはずなのに出てこない ● ていうか途中から間違ってるし ● C言語の小数は「固定長」だった! ● 代わりに「多倍長整数」に出会う ● 手元で実装したり decimal.rubyforge.org
  • 15. 高校生 ● 多倍長「整数」の計算に必要な数式を組み立て ては崩し ● 「いくらでも長い整数」が扱えれば「いくらで も長い小数」も扱えるんじゃ? ● AO入試で逆質問 ● 先生「んなの簡単」 ● 俺「???」 ● Rubyに出会う (Ruby本の出る出る詐欺未遂事件) decimal.rubyforge.org
  • 16. 大学生 ● Rubyにちょっかいを出し始める ● 1.8リリース、標準添付ライブラリ拡大路線 ● BigDecimalが飛び込んできた!!! ● ソースを読んだり、数式で悩んだり ● ようやく「いくらでも長い小数」を計算できる 原理を理解 decimal.rubyforge.org
  • 17. BigDecimalのAPIにちょっかい ● 2003年、1.8.0リリースの直前 ● 前身のBigFloatとは違う性質 ● なのに代わり映えしないAPI(メソッド群) ● Numeric全般も気にしないオレオレAPI ● →だいぶ変えてもらいました ● →まだ不満 ● →ほぼそのまま現在に至る(1.9.2) decimal.rubyforge.org
  • 18. 身の上をまとめると ● π を計算したかった ● BigDecimalには不満があった ● →なら新しく作っちゃえばいいじゃない ● = Decimal ! ● Decimal::Math.pi(n) #=> 小数点以下n桁のπ! decimal.rubyforge.org
  • 20. 設計上の工夫 ● APIは最小限に ● 既存クラスとの親和性を高く ● 厳密さを保つ decimal.rubyforge.org
  • 21. APIは最小限に ● オレオレAPIはいらない ● クラスメソッド5個、インスタンスメソッド13個減 ● 「多倍長」「十進」を生かすものは残す ● d = Decimal(“1.23”) d.round(1, :up) #=> Decimal(1.3) ● 必要になったら後から入れる ● 後から「消す」のは大変だよね decimal.rubyforge.org
  • 22. 既存クラスとの親和性を高く ● Rubyの数なんだからNumeric ● 「小数」なんだから「だいたいFloat」 ● Float・他のNumericのメソッドと同じ名前では 同じ動作 ● Floatを返すMath.functionも Decimal::Math.functionとして実装 ● sinとかsqrtとかlogとか ● Floatと違い、何桁でも計算できます decimal.rubyforge.org
  • 23. 厳密さを保つ ● BigDecimalはFloatとの「自然な」演算が有効 ● BigDecimal(“1.23”) + 0.1 #=> 通っちゃう…不正確! ● Decimalはプログラマが精度を明示しない限り 厳密さを保つ ● Floatとの演算を軒並みエラーに ● 不正確さを明示 ● どうしても一緒にしたいときはDecimal#to_fして ください decimal.rubyforge.org
  • 25. 実装上の工夫 ● コード再利用 ● 省メモリ decimal.rubyforge.org
  • 27. RubyKaigi2009… decimal.rubyforge.org
  • 30. 3.14
  • 33. 3.14
  • 40. 実装上の工夫 ● コード再利用 ● 省メモリ decimal.rubyforge.org
  • 41. コード再利用 (1/2) ● BigDecimalは「大きい整数」を自前で実装 ● それってBignumでよくない? ● →やったらあっさりできた ● C API: rb_big_plus(), rb_big_mul(), … ● 135,334 バイト (BigDecimal) vs 59,706 バイト (Decimal) ● 55%以上の小型化 ● しかも速いし (e.g. 1.9.1 → 1.9.2) decimal.rubyforge.org
  • 42. コード再利用 (2/2) ● つまり ● 実装のコンパクト化 ● 高速化 ● 同時に達成! ● B-) decimal.rubyforge.org
  • 43. 省メモリ (1/2) ● BigDecimal インスタンス本体 typedef struct { ← いらない VALUE obj; U_LONG MaxPrec; U_LONG Prec; S_INT exponent; short sign; short flag; U_LONG frac[1]; } Real; decimal.rubyforge.org
  • 44. 省メモリ (2/2) ● 我がDecimal インスタンス本体 typedef struct { VALUE inum; long scale; } Decimal; ● スッキリ! decimal.rubyforge.org
  • 45. という感じで ● いろいろがんばりました ● Ruby Summer of Codeに採択&完走、賞金$5000! ● /(^o^)\ decimal.rubyforge.org
  • 46. まとめ ● Decimalはふつうの小数をふつうに計算するた めのライブラリです ● 既存のBigDecimalよりおいしいです (^p^ ● 使ってやってください m(_ _)m decimal.rubyforge.org