SlideShare une entreprise Scribd logo
1  sur  46
Télécharger pour lire hors ligne
詳解! 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

Contenu connexe

Tendances

C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
ラムダ計算入門
ラムダ計算入門ラムダ計算入門
ラムダ計算入門Eita Sugimoto
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解MITSUNARI Shigeo
 
Web ベースのカジュアルゲーム「block pong」の実装とビジネス
Web ベースのカジュアルゲーム「block pong」の実装とビジネスWeb ベースのカジュアルゲーム「block pong」の実装とビジネス
Web ベースのカジュアルゲーム「block pong」の実装とビジネスt-kihira
 
Apache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once SemanticsApache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once SemanticsYoshiyasu SAEKI
 
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書くmametter
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとはTakuya Akiba
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣Masahiro Nishimi
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Inc.
 
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用Takuya Ueda
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみたSatoshi Sato
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~Miki Shimogai
 
elasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみたelasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみたfurandon_pig
 
証明プログラミング超入門
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門Kyoko Kadowaki
 

Tendances (20)

C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
よいコード、わるいコード
よいコード、わるいコードよいコード、わるいコード
よいコード、わるいコード
 
ラムダ計算入門
ラムダ計算入門ラムダ計算入門
ラムダ計算入門
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
Web ベースのカジュアルゲーム「block pong」の実装とビジネス
Web ベースのカジュアルゲーム「block pong」の実装とビジネスWeb ベースのカジュアルゲーム「block pong」の実装とビジネス
Web ベースのカジュアルゲーム「block pong」の実装とビジネス
 
Javaメモリ勉強会
Javaメモリ勉強会Javaメモリ勉強会
Javaメモリ勉強会
 
Apache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once SemanticsApache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once Semantics
 
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書く
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説
 
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
elasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみたelasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみた
 
証明プログラミング超入門
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門
 

En vedette

高校生のためのソーシャルメディア活用術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 problemsNaoaki 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 worksMasahiro Sakai
 

En vedette (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
 

Similaire à 詳解! Decimal

Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
Hacking Ruby with Python
Hacking Ruby with PythonHacking Ruby with Python
Hacking Ruby with PythonTaisuke 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_vol1Keisuke Nakata
 
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeコマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeKiwamu Okabe
 
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
 
第一回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
 
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の解説 & WalkthroughIsaac Mathis
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案yushin_hirano
 
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programmingmametter
 
これからのコンピューティングとJava(Hacker Tackle)
これからのコンピューティングとJava(Hacker Tackle)これからのコンピューティングとJava(Hacker Tackle)
これからのコンピューティングとJava(Hacker Tackle)なおき きしだ
 

Similaire à 詳解! 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
 
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 クラスについて
 
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勉強会 -第二章 - 原案
 
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
 
これからのコンピューティングとJava(Hacker Tackle)
これからのコンピューティングとJava(Hacker Tackle)これからのコンピューティングとJava(Hacker Tackle)
これからのコンピューティングとJava(Hacker Tackle)
 

Dernier

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 

Dernier (10)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

詳解! 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