SlideShare a Scribd company logo
1 of 82
Download to read offline
Hokkaido.pm #8
                           Lightning Talk
                          Hachioji.pm / Kokusaitenjijomae.pm
                                      @moznion



Sunday, December 23, 12
@moznion
                          大学生
                          アルバイトソフトウェア
                          エンジニア

                          2年前まで道民でした

                          2日前に論文が
                          リジェクトされたので
                          ブルー入ってます
Sunday, December 23, 12
クリスマスらしく
                          Acme の話……



Sunday, December 23, 12
クリスマスらしく
                          Acme の話……
                           はしません

Sunday, December 23, 12
皆さん
          Perl で数値計算してますか!?




Sunday, December 23, 12
数値計算してると
          クソ面倒なアイツがいますよね




Sunday, December 23, 12
浮動小数点数



Sunday, December 23, 12
浮動小数点数
                           めんどい


Sunday, December 23, 12
浮動小数点数
                           めんどい
                            今日はこれについて


Sunday, December 23, 12
さて
                          拙作のモジュールで
                           ハマったこと


Sunday, December 23, 12
浮動小数点数を
                          こんな感じでテスト
                          すると死ねます


Sunday, December 23, 12
Sunday, December 23, 12
見るからにやばそう
Sunday, December 23, 12
こういう事をすると
                          テストがズッコケる
                           環境が出てくる


Sunday, December 23, 12
ぐぬぬ…




Sunday, December 23, 12
ありがたいことに
                           ISSUE が来る
                  (@syohex さんありがとうございます)




Sunday, December 23, 12
ISSUE が来る
                          (ありがたいことに)


             https://github.com/moznion/Math--PhaseOnlyCorrelation/issues/1


Sunday, December 23, 12
浮動小数は色々めんどいから
                    普通に比較するとダメよ、
                                   とのこと
           † 以下が詳しい
                x86における浮動小数点演算の精度の制御と、
                80bit 浮動小数点演算問題
                  http://www.takeoka.org/~take/cpu/num/float80bit.html


Sunday, December 23, 12
あと
                            CPAN Testers Daily
                          Summary Reportからも
                           毎日メールが来る
                                (深夜に)

Sunday, December 23, 12
そして
                  夜も眠れない!!
                   CPAN Testers Daily
                 Summary Reportから
            (Report はありがたいんですが)
                          毎日メールが来る


Sunday, December 23, 12
夜は眠りたいので
                           直しましょう



Sunday, December 23, 12
方法 1


Sunday, December 23, 12
小数点以下を切り捨てて
               整数にしてからテストをする




Sunday, December 23, 12
e.g.


                          TODO こんなかんじ




Sunday, December 23, 12
e.g.


                           まさに外道!!!
                          TODO こんなかんじ




Sunday, December 23, 12
悪党な方法過ぎて駄目
                   そもそもテストの正当性が
                            失われている



Sunday, December 23, 12
方法 2


Sunday, December 23, 12
$var * 10 ^ $num
                          してから小数点以下を
                          切り捨ててテストする



Sunday, December 23, 12
e.g.




Sunday, December 23, 12
$num 桁までの精度は
                            保証される
               ただ、ちょっとダサい (主観)



Sunday, December 23, 12
あと、整数桁数が
                           莫大に増えたら
                          それもそれで問題な気が



Sunday, December 23, 12
方法 3


Sunday, December 23, 12
採択域を設定して、
                   両者の差がその範囲内かを
                           テストする



Sunday, December 23, 12
e.g.

                          TODO こんなかんじ




Sunday, December 23, 12
割と良い感じ。
                          拙作のモジュールでも
                一時期 (3日くらい) やってた



Sunday, December 23, 12
方法 4


Sunday, December 23, 12
正規表現でバツンと切って
                          小数桁数を制限する




Sunday, December 23, 12
e.g.




Sunday, December 23, 12
結構メイジャーな方法っぽい
                (特にPhysics のモジュールで)
                          けど、なんかやだ (主観)



Sunday, December 23, 12
方法 5


Sunday, December 23, 12
sprintf(“%.${num}f”, $var)
                          を使って桁数を制限する




Sunday, December 23, 12
e.g.




Sunday, December 23, 12
これが一番しっくり来た。
                           なんか良い感じ
                          (Math のモジュールで
                            良く見かける)


Sunday, December 23, 12
方法 6


Sunday, December 23, 12
Acme::Test を使う


Sunday, December 23, 12
Sunday, December 23, 12
例とか無いです


Sunday, December 23, 12
とまあ
                          こんな感じで


Sunday, December 23, 12
浮動小数点数
                           めんどい


Sunday, December 23, 12
ただ



Sunday, December 23, 12
浮動小数点数
                           めんどい




Sunday, December 23, 12
浮動小数点数
                           めんどい


                          テストめんどい

Sunday, December 23, 12
浮動小数点数
                            めんどい
                          こうなるとまずい
                          テストめんどい

Sunday, December 23, 12
「テストこけるけど動くから
                 大丈夫だよー」
           「めんどいからテストしなくて
                  もいいよー」
            「“cpanm -f Foo::Bar” でおk」


Sunday, December 23, 12
「テストこけるけど動くから
                 大丈夫だよー」
              破滅待ったなし
           「めんどいからテストしなくて
                  もいいよー」
            「“cpanm -f Foo::Bar” でおk」


Sunday, December 23, 12
テストを          ろにしてはならない




Sunday, December 23, 12
その為には?




Sunday, December 23, 12
1
Sunday, December 23, 12
テストがすぐ実行できて軽いこと

           こまめにテストを走らせられる
               (物理的 | 心理的)環境を整える


Sunday, December 23, 12
2
Sunday, December 23, 12
テストが書きやすいこと

                書きやすければ書きやすい程
                          テストの習慣は定着する


Sunday, December 23, 12
テストの書きやすさ、
                             マジ重要!



Sunday, December 23, 12
というわけで、
                浮動小数点のテストを支える
                モジュールが有るとハッピー



Sunday, December 23, 12
例えば
                          Test::Number::Delta


Sunday, December 23, 12
方法3 として挙げた
                     採択域うんぬんのテストを
                       サポートしてくれる



Sunday, December 23, 12
e.g.


                          TODO こんなかんじ


                               (デフォルトだと1-e6 が採択域)



Sunday, December 23, 12
Cool !


Sunday, December 23, 12
名前的に
                            Test::Float
                          もイケそうだけど
                          使ったことないです

Sunday, December 23, 12
あと今
                          Test::LimitDecimalPlaces
                           というモジュールを
                                      書いてます
                          https://github.com/moznion/Test--LimitDecimalPlaces




Sunday, December 23, 12
方法5 として挙げた
                           sprintf() を使って
           テスト出来るモジュールです
                          (ヘルパーメソッド的な)


Sunday, December 23, 12
こんな感じで使えます




Sunday, December 23, 12
内部的にはこんな感じ




Sunday, December 23, 12
ただ問題が




Sunday, December 23, 12
Test::LimitDecimalPlaces




Sunday, December 23, 12
Test::LimitDecimalPlaces
                                       名前がダサい


Sunday, December 23, 12
limit_ok
                             limit_ok_by
                            limit_not_ok
                          limit_not_ok_by



Sunday, December 23, 12
limit_ok
                             limit_ok_by
                            limit_not_ok
                          limit_not_ok_by
                             メソッド名がダサい


Sunday, December 23, 12
limit_ok
                              limit_ok_by
                             limit_not_ok
                           limit_not_ok_by
                             メソッド名がダサい
                          そもそも英文法的に怪しい

Sunday, December 23, 12
とりあえず
                          PrePAN に投げて反応を
                     待とうかと思っています


Sunday, December 23, 12
アドバイス
                          目下募集中です
                     よろしくお願いします。


Sunday, December 23, 12
あと、他にも浮動小数点数
               周りの良いテストモジュール
                          があれば教えてください



Sunday, December 23, 12
了

Sunday, December 23, 12

More Related Content

Viewers also liked

"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pmRyosuke IWANAGA
 
PHPカンファレンス北海道_20160416
PHPカンファレンス北海道_20160416PHPカンファレンス北海道_20160416
PHPカンファレンス北海道_20160416Yoshihiro Sasaki
 
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)goccy
 
Takao.mt 2013
Takao.mt 2013Takao.mt 2013
Takao.mt 2013moznion
 
テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」technocat
 
Plack::Request with Encoding
Plack::Request with EncodingPlack::Request with Encoding
Plack::Request with Encodingmoznion
 
理解したつもりになるGit入門
理解したつもりになるGit入門理解したつもりになるGit入門
理解したつもりになるGit入門Yoshihiro Sasaki
 
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使うYAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使うmoznion
 
テーマ「なんでもないようなこと」
テーマ「なんでもないようなこと」テーマ「なんでもないようなこと」
テーマ「なんでもないようなこと」technocat
 
YAPCレポートの舞台裏
YAPCレポートの舞台裏YAPCレポートの舞台裏
YAPCレポートの舞台裏Masahiro Honma
 
Google trends to_irc
Google trends to_ircGoogle trends to_irc
Google trends to_ircrarere
 
Games::* - Perlで 「ゲーム」しよう #hokkaidopm
Games::* - Perlで 「ゲーム」しよう #hokkaidopmGames::* - Perlで 「ゲーム」しよう #hokkaidopm
Games::* - Perlで 「ゲーム」しよう #hokkaidopm鉄次 尾形
 
CPAN/便利モジュール
CPAN/便利モジュールCPAN/便利モジュール
CPAN/便利モジュールYoshihiro Sasaki
 
変数、リファレンス
変数、リファレンス変数、リファレンス
変数、リファレンスcharsbar
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミングlestrrat
 

Viewers also liked (20)

YAPC::AsiaとHokkaido.pm
YAPC::AsiaとHokkaido.pmYAPC::AsiaとHokkaido.pm
YAPC::AsiaとHokkaido.pm
 
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
 
Use Carton
Use CartonUse Carton
Use Carton
 
PHPカンファレンス北海道_20160416
PHPカンファレンス北海道_20160416PHPカンファレンス北海道_20160416
PHPカンファレンス北海道_20160416
 
Using Dancer
Using DancerUsing Dancer
Using Dancer
 
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
 
Takao.mt 2013
Takao.mt 2013Takao.mt 2013
Takao.mt 2013
 
テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」
 
Plack::Request with Encoding
Plack::Request with EncodingPlack::Request with Encoding
Plack::Request with Encoding
 
理解したつもりになるGit入門
理解したつもりになるGit入門理解したつもりになるGit入門
理解したつもりになるGit入門
 
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使うYAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
 
テーマ「なんでもないようなこと」
テーマ「なんでもないようなこと」テーマ「なんでもないようなこと」
テーマ「なんでもないようなこと」
 
YAPCレポートの舞台裏
YAPCレポートの舞台裏YAPCレポートの舞台裏
YAPCレポートの舞台裏
 
Asset Pipeline for Perl
Asset Pipeline for PerlAsset Pipeline for Perl
Asset Pipeline for Perl
 
Google trends to_irc
Google trends to_ircGoogle trends to_irc
Google trends to_irc
 
Games::* - Perlで 「ゲーム」しよう #hokkaidopm
Games::* - Perlで 「ゲーム」しよう #hokkaidopmGames::* - Perlで 「ゲーム」しよう #hokkaidopm
Games::* - Perlで 「ゲーム」しよう #hokkaidopm
 
CPAN/便利モジュール
CPAN/便利モジュールCPAN/便利モジュール
CPAN/便利モジュール
 
変数、リファレンス
変数、リファレンス変数、リファレンス
変数、リファレンス
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
cpanfile
cpanfilecpanfile
cpanfile
 

More from moznion

Static analysis for perl
Static analysis for perlStatic analysis for perl
Static analysis for perlmoznion
 
Yet Another Perl Cooking
Yet Another Perl CookingYet Another Perl Cooking
Yet Another Perl Cookingmoznion
 
Jesque robust-worker-pool
Jesque robust-worker-poolJesque robust-worker-pool
Jesque robust-worker-poolmoznion
 
Hachioji persec
Hachioji persecHachioji persec
Hachioji persecmoznion
 
Inner world of Perl::Lint
Inner world of Perl::LintInner world of Perl::Lint
Inner world of Perl::Lintmoznion
 
命名の話
命名の話命名の話
命名の話moznion
 
Hachiojipm 44
Hachiojipm 44Hachiojipm 44
Hachiojipm 44moznion
 
Perl::Lint is over, for the present
Perl::Lint is over, for the presentPerl::Lint is over, for the present
Perl::Lint is over, for the presentmoznion
 
Perl::Lint - Yet Another Perl Source Code Linter
Perl::Lint - Yet Another Perl Source Code LinterPerl::Lint - Yet Another Perl Source Code Linter
Perl::Lint - Yet Another Perl Source Code Lintermoznion
 
Hachioji.pm 40
Hachioji.pm 40Hachioji.pm 40
Hachioji.pm 40moznion
 
Hachioji.pm #39
Hachioji.pm #39Hachioji.pm #39
Hachioji.pm #39moznion
 
Talking About Japanese Area Code of Phone
Talking About Japanese Area Code of PhoneTalking About Japanese Area Code of Phone
Talking About Japanese Area Code of Phonemoznion
 
Hachioji.pm 38
Hachioji.pm 38Hachioji.pm 38
Hachioji.pm 38moznion
 
Hokkaido.pm #11
Hokkaido.pm #11Hokkaido.pm #11
Hokkaido.pm #11moznion
 
Hachiojipm 36
Hachiojipm 36Hachiojipm 36
Hachiojipm 36moznion
 
Net stalking with-lastfm
Net stalking with-lastfmNet stalking with-lastfm
Net stalking with-lastfmmoznion
 
Perl beginners #08
Perl beginners #08Perl beginners #08
Perl beginners #08moznion
 
Hachiojipm 28
Hachiojipm 28Hachiojipm 28
Hachiojipm 28moznion
 
Hachiojipm 26
Hachiojipm 26Hachiojipm 26
Hachiojipm 26moznion
 
You Can Be a CPAN Auhor
You Can Be a CPAN AuhorYou Can Be a CPAN Auhor
You Can Be a CPAN Auhormoznion
 

More from moznion (20)

Static analysis for perl
Static analysis for perlStatic analysis for perl
Static analysis for perl
 
Yet Another Perl Cooking
Yet Another Perl CookingYet Another Perl Cooking
Yet Another Perl Cooking
 
Jesque robust-worker-pool
Jesque robust-worker-poolJesque robust-worker-pool
Jesque robust-worker-pool
 
Hachioji persec
Hachioji persecHachioji persec
Hachioji persec
 
Inner world of Perl::Lint
Inner world of Perl::LintInner world of Perl::Lint
Inner world of Perl::Lint
 
命名の話
命名の話命名の話
命名の話
 
Hachiojipm 44
Hachiojipm 44Hachiojipm 44
Hachiojipm 44
 
Perl::Lint is over, for the present
Perl::Lint is over, for the presentPerl::Lint is over, for the present
Perl::Lint is over, for the present
 
Perl::Lint - Yet Another Perl Source Code Linter
Perl::Lint - Yet Another Perl Source Code LinterPerl::Lint - Yet Another Perl Source Code Linter
Perl::Lint - Yet Another Perl Source Code Linter
 
Hachioji.pm 40
Hachioji.pm 40Hachioji.pm 40
Hachioji.pm 40
 
Hachioji.pm #39
Hachioji.pm #39Hachioji.pm #39
Hachioji.pm #39
 
Talking About Japanese Area Code of Phone
Talking About Japanese Area Code of PhoneTalking About Japanese Area Code of Phone
Talking About Japanese Area Code of Phone
 
Hachioji.pm 38
Hachioji.pm 38Hachioji.pm 38
Hachioji.pm 38
 
Hokkaido.pm #11
Hokkaido.pm #11Hokkaido.pm #11
Hokkaido.pm #11
 
Hachiojipm 36
Hachiojipm 36Hachiojipm 36
Hachiojipm 36
 
Net stalking with-lastfm
Net stalking with-lastfmNet stalking with-lastfm
Net stalking with-lastfm
 
Perl beginners #08
Perl beginners #08Perl beginners #08
Perl beginners #08
 
Hachiojipm 28
Hachiojipm 28Hachiojipm 28
Hachiojipm 28
 
Hachiojipm 26
Hachiojipm 26Hachiojipm 26
Hachiojipm 26
 
You Can Be a CPAN Auhor
You Can Be a CPAN AuhorYou Can Be a CPAN Auhor
You Can Be a CPAN Auhor
 

Hokkaido pm 8 LT