SlideShare uma empresa Scribd logo
1 de 46
Baixar para ler offline
詳解! 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

Mais conteúdo relacionado

Mais procurados

DI(依存性注入)について
DI(依存性注入)についてDI(依存性注入)について
DI(依存性注入)についてYui Ito
 
iBeaconを身近に!アプリ開発の基礎とポイント
iBeaconを身近に!アプリ開発の基礎とポイントiBeaconを身近に!アプリ開発の基礎とポイント
iBeaconを身近に!アプリ開発の基礎とポイントleverages_event
 
HTMLを書くだけで誰でも簡単!A-FrameではじめるWeb AR/VR
HTMLを書くだけで誰でも簡単!A-FrameではじめるWeb AR/VRHTMLを書くだけで誰でも簡単!A-FrameではじめるWeb AR/VR
HTMLを書くだけで誰でも簡単!A-FrameではじめるWeb AR/VRTakashi Yoshinaga
 
バイナリアンを目指して For a binaryen
バイナリアンを目指して For a binaryenバイナリアンを目指して For a binaryen
バイナリアンを目指して For a binaryenEyes, JAPAN
 
Redmine本家コピー+投票サイト作成(Python-Redmine利用事例)
Redmine本家コピー+投票サイト作成(Python-Redmine利用事例)Redmine本家コピー+投票サイト作成(Python-Redmine利用事例)
Redmine本家コピー+投票サイト作成(Python-Redmine利用事例)Yuuki Nara
 
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミングJavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミングKent Ohashi
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―shinjiigarashi
 
краса і велич рідної землі
краса і велич рідної землікраса і велич рідної землі
краса і велич рідної земліOlga Sokolik
 
ctfで学ぼうリバースエンジニアリング
ctfで学ぼうリバースエンジニアリングctfで学ぼうリバースエンジニアリング
ctfで学ぼうリバースエンジニアリングjunk_coken
 
【Unite Tokyo 2019】ゼロから始めるアラビア語レンダリング
【Unite Tokyo 2019】ゼロから始めるアラビア語レンダリング【Unite Tokyo 2019】ゼロから始めるアラビア語レンダリング
【Unite Tokyo 2019】ゼロから始めるアラビア語レンダリングUnityTechnologiesJapan002
 
The Art of Computer Programming 2.3.2 Tree
The Art of Computer Programming 2.3.2 TreeThe Art of Computer Programming 2.3.2 Tree
The Art of Computer Programming 2.3.2 Treehyun soomyung
 
Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発Tsutomu Yano
 
インタフェースの実装パターン
インタフェースの実装パターンインタフェースの実装パターン
インタフェースの実装パターンTakuya Ueda
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
オブジェクト指向とは何ですか?
オブジェクト指向とは何ですか?オブジェクト指向とは何ですか?
オブジェクト指向とは何ですか?sumim
 
はじめる! Redmine (2021年版)
はじめる! Redmine (2021年版) はじめる! Redmine (2021年版)
はじめる! Redmine (2021年版) Go Maeda
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)parrotstudio
 
Drupal のコア要素を知る ~構築を支える道具立て~
Drupal のコア要素を知る ~構築を支える道具立て~Drupal のコア要素を知る ~構築を支える道具立て~
Drupal のコア要素を知る ~構築を支える道具立て~Kenji Shirane
 
PHPの今とこれから2022
PHPの今とこれから2022PHPの今とこれから2022
PHPの今とこれから2022Rui Hirokawa
 

Mais procurados (20)

DI(依存性注入)について
DI(依存性注入)についてDI(依存性注入)について
DI(依存性注入)について
 
iBeaconを身近に!アプリ開発の基礎とポイント
iBeaconを身近に!アプリ開発の基礎とポイントiBeaconを身近に!アプリ開発の基礎とポイント
iBeaconを身近に!アプリ開発の基礎とポイント
 
HTMLを書くだけで誰でも簡単!A-FrameではじめるWeb AR/VR
HTMLを書くだけで誰でも簡単!A-FrameではじめるWeb AR/VRHTMLを書くだけで誰でも簡単!A-FrameではじめるWeb AR/VR
HTMLを書くだけで誰でも簡単!A-FrameではじめるWeb AR/VR
 
バイナリアンを目指して For a binaryen
バイナリアンを目指して For a binaryenバイナリアンを目指して For a binaryen
バイナリアンを目指して For a binaryen
 
Redmine本家コピー+投票サイト作成(Python-Redmine利用事例)
Redmine本家コピー+投票サイト作成(Python-Redmine利用事例)Redmine本家コピー+投票サイト作成(Python-Redmine利用事例)
Redmine本家コピー+投票サイト作成(Python-Redmine利用事例)
 
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミングJavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
краса і велич рідної землі
краса і велич рідної землікраса і велич рідної землі
краса і велич рідної землі
 
ctfで学ぼうリバースエンジニアリング
ctfで学ぼうリバースエンジニアリングctfで学ぼうリバースエンジニアリング
ctfで学ぼうリバースエンジニアリング
 
【Unite Tokyo 2019】ゼロから始めるアラビア語レンダリング
【Unite Tokyo 2019】ゼロから始めるアラビア語レンダリング【Unite Tokyo 2019】ゼロから始めるアラビア語レンダリング
【Unite Tokyo 2019】ゼロから始めるアラビア語レンダリング
 
The Art of Computer Programming 2.3.2 Tree
The Art of Computer Programming 2.3.2 TreeThe Art of Computer Programming 2.3.2 Tree
The Art of Computer Programming 2.3.2 Tree
 
Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
インタフェースの実装パターン
インタフェースの実装パターンインタフェースの実装パターン
インタフェースの実装パターン
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
オブジェクト指向とは何ですか?
オブジェクト指向とは何ですか?オブジェクト指向とは何ですか?
オブジェクト指向とは何ですか?
 
はじめる! Redmine (2021年版)
はじめる! Redmine (2021年版) はじめる! Redmine (2021年版)
はじめる! Redmine (2021年版)
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
Drupal のコア要素を知る ~構築を支える道具立て~
Drupal のコア要素を知る ~構築を支える道具立て~Drupal のコア要素を知る ~構築を支える道具立て~
Drupal のコア要素を知る ~構築を支える道具立て~
 
PHPの今とこれから2022
PHPの今とこれから2022PHPの今とこれから2022
PHPの今とこれから2022
 

Destaque

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

Destaque (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
 

Semelhante a 詳解! 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
 
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
 
第一回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の解説 & 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
 

Semelhante a 詳解! 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勉強会 -第二章 - 原案
 

Último

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 

Último (9)

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 

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