SlideShare ist ein Scribd-Unternehmen logo
1 von 29
Downloaden Sie, um offline zu lesen
浮動小数点数の話
2013年度版
hnw
第70回PHP勉強会(2013/07/22) 発表資料
13年7月23日火曜日
自己紹介
@hnw / id:hnw
勤務先:KLab株式会社
カレーとバグが大好物
最近の興味:Zend OPcache
改造しがいがある、最近イチオシのオモチャ
13年7月23日火曜日
今日おはなしすること
浮動小数点数の怖い話
round関数の近況
MySQLでの小数の扱い
13年7月23日火曜日
浮動小数点数の怖い話
round関数の近況
MySQLでの小数の扱い
13年7月23日火曜日
浮動小数点数の怖い話(1)
例:ゲーム内のアイテムの売買機能
プレイヤーはアイテムを店で定価で買える
定価の10%増しで、NPCが買い取ってくれる
端数が出た場合、小数点以下切り上げ(5.5→6)
13年7月23日火曜日
浮動小数点数の怖い話(1)
例:ゲーム内のアイテムの売買機能
プレイヤーはアイテムを店で定価で買える
定価の10%増しで、NPCが買い取ってくれる
端数が出た場合、小数点以下切り上げ(5.5→6)
罠に気づきましたか?
13年7月23日火曜日
浮動小数点数の怖い話(2)
定価100コインのアイテムの売価が111コインになる!
100の10%増しなら110 のはずでは…?
実験してみる(1.1倍して切り上げ)
13年7月23日火曜日
何が問題だったか?
1.1倍したのが問題
1.0や0.5はピッタリ表現できるが、0.1だと誤差が入る
11.0倍して10.0で割っていれば問題なかった
13年7月23日火曜日
補足(1)
浮動小数点数の性質からくる問題
浮動小数点数は2進数なので、1/5は循環小数になる
有限桁(53bit)で打ち切られるので、誤差が入る
PHPに限らず、多くの言語で起こる現象
10進小数クラスや有理数クラスを持つ言語もある
13年7月23日火曜日
補足(2)
浮動小数点数演算で誤差を避ける方法は?
浮動小数点数で「ピッタリ」表せる数を使うこと
誤差が入りうる計算を後回しにすること
整数演算だけで済む仕様に誘導するのも手
13年7月23日火曜日
補足(3)
浮動小数点数で無理ならgmp関数を使ってもよい
BC Mathは素性が不明だわ遅いわでイマイチな印象
「その処理をPHPでやるのが正解か?」も要検討
13年7月23日火曜日
浮動小数点数の怖い話
round関数の近況
MySQLでの小数の扱い
13年7月23日火曜日
こんなことがありました
PHP 5.2.xのround関数の実装がイマイチというネタで炎上
http://d.hatena.ne.jp/hnw/20070515
日記書き始めて10エントリ目くらいだった
まつもとゆきひろさんの日記で言及→DIS大会
13年7月23日火曜日
応戦してた
どう見てもヤバい人です。
13年7月23日火曜日
当時のround関数の概要
round(x)の実装が普通と違った
普通の実装:x > 0 なら floor(x+0.5)
PHPの実装:x > 0 なら floor(x+0.50000000001)
13年7月23日火曜日
当時のround関数の概要
round(x)の実装が普通と違った
普通の実装:x > 0 なら floor(x+0.5)
PHPの実装:x > 0 なら floor(x+0.50000000001)
↑ 意味わからん
13年7月23日火曜日
議論の概要
PHP以外の人「これだからPHPは」
僕「指摘が浮動小数点数的に間違ってるけど?」
 「RubyやPythonやPerlのコレもバグじゃね?」
浮動小数点数まわりのバグが結構見つかった
PHPがひどい点については基本スルー
13年7月23日火曜日
今どうなってるか(1)
PHP 5.3以降、round関数の仕様と実装が変わりました
詳細:https://wiki.php.net/rfc/rounding
x > 0 なら floor(x+0.5) と、他の言語と同様の実装
大きい数にだけ起こる、直しにくいバグが残っている
http://d.hatena.ne.jp/hnw/20110407
13年7月23日火曜日
今どうなってるか(2)
僕が当時指摘したバグはRuby 1.8.7とPython 2.7.3で
すべて修正されている
すげえ!
なおPerl 5.14.4では修正されていない模様
13年7月23日火曜日
浮動小数点数の怖い話
round関数の近況
MySQLでの小数の扱い
13年7月23日火曜日
MySQLでの小数
小数リテラルは固定小数点数になる
固定小数点数=桁数と小数点の位置が決まっている表現
MySQLではDECIMAL型が対応する
DECIMAL(10, 2) : 全10桁、小数以下2桁
13年7月23日火曜日
固定小数点数の世界
誤差の問題から解放される
これで平和が訪れた!
= true
13年7月23日火曜日
固定小数点数の世界
誤差の問題から解放される
これで平和が訪れた!
と思ったでしょ?残念!
= true
13年7月23日火曜日
浮動小数点数の恐怖再び
文字列リテラルに対して加減算→自動キャスト
文字列を数値にキャスト→浮動小数点数になる
= false
13年7月23日火曜日
イマイチなPDOの仕様
PDOはプレースホルダの展開時に
PHP変数の型が文字列なら必ずクォーティングする
PDO::PARAM_INTの指定はbool型のみ影響する
参照:http://stackoverflow.com/questions/833510/
php-pdobindparam-data-types-how-does-it-work
数値なのに文字列型になっている場合は要注意
13年7月23日火曜日
小数を避ければ平気か
「DB上で小数なんて使わないから自分には関係ない」
とか思ってませんか
小数点が無くても浮動小数点数を経由します
= true
13年7月23日火曜日
何が起きたのか?
文字列をキャストして浮動小数点数になった
2^53以上の整数は浮動小数点数で正しく表現できない
前のページの例では、1を足したはずが2増えた
10進で16桁以上の整数を扱う場合は要注意
BIGINT型など
13年7月23日火曜日
まとめ
浮動小数点数は罠がたくさん
罠を避けるには知識が必要
PHPのround関数は昔よりマトモになった
MySQLにも浮動小数点数の罠がある
PHPだとPDOがイマイチなせいで罠を踏みやすい
13年7月23日火曜日
ご静聴
ありがとう
ございました
13年7月23日火曜日

Weitere ähnliche Inhalte

Andere mochten auch

Slide keieisystem2012
Slide keieisystem2012Slide keieisystem2012
Slide keieisystem2012ISE_SE_HOSEI
 
情報の表現~コンピュータでの数値の表現
情報の表現~コンピュータでの数値の表現情報の表現~コンピュータでの数値の表現
情報の表現~コンピュータでの数値の表現Tokai University
 
AtCoder Regular Contest 018 解説
AtCoder Regular Contest 018 解説AtCoder Regular Contest 018 解説
AtCoder Regular Contest 018 解説AtCoder Inc.
 
Cvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 halfCvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 halftomoaki0705
 
できるプログラマーを本気で育てるSwift超入門iosプログラマーへの第一歩
できるプログラマーを本気で育てるSwift超入門iosプログラマーへの第一歩できるプログラマーを本気で育てるSwift超入門iosプログラマーへの第一歩
できるプログラマーを本気で育てるSwift超入門iosプログラマーへの第一歩technologicarts
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮JAVA DM
 
図解入門最新マーケティング・リサーチがよーくわかる本(3)
図解入門最新マーケティング・リサーチがよーくわかる本(3)図解入門最新マーケティング・リサーチがよーくわかる本(3)
図解入門最新マーケティング・リサーチがよーくわかる本(3)MROC Japan
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4Takeshi Yamamuro
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Tetsuya Yoshida
 
kagami_comput2015_12
kagami_comput2015_12kagami_comput2015_12
kagami_comput2015_12swkagami
 
kagami_comput2016_08
kagami_comput2016_08kagami_comput2016_08
kagami_comput2016_08swkagami
 
kagami_comput2016_06
kagami_comput2016_06kagami_comput2016_06
kagami_comput2016_06swkagami
 
kagami_comput2016_09
kagami_comput2016_09kagami_comput2016_09
kagami_comput2016_09swkagami
 
kagami_comput2016_05
kagami_comput2016_05kagami_comput2016_05
kagami_comput2016_05swkagami
 
kagami_comput2016_07
kagami_comput2016_07kagami_comput2016_07
kagami_comput2016_07swkagami
 
3_C言語入門 - C言語の基本
3_C言語入門 - C言語の基本3_C言語入門 - C言語の基本
3_C言語入門 - C言語の基本bc_rikko
 

Andere mochten auch (20)

Slide keieisystem2012
Slide keieisystem2012Slide keieisystem2012
Slide keieisystem2012
 
計算機理論入門04
計算機理論入門04計算機理論入門04
計算機理論入門04
 
計算機理論入門07
計算機理論入門07計算機理論入門07
計算機理論入門07
 
情報の表現~コンピュータでの数値の表現
情報の表現~コンピュータでの数値の表現情報の表現~コンピュータでの数値の表現
情報の表現~コンピュータでの数値の表現
 
計算機理論入門05
計算機理論入門05計算機理論入門05
計算機理論入門05
 
AtCoder Regular Contest 018 解説
AtCoder Regular Contest 018 解説AtCoder Regular Contest 018 解説
AtCoder Regular Contest 018 解説
 
Cvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 halfCvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 half
 
できるプログラマーを本気で育てるSwift超入門iosプログラマーへの第一歩
できるプログラマーを本気で育てるSwift超入門iosプログラマーへの第一歩できるプログラマーを本気で育てるSwift超入門iosプログラマーへの第一歩
できるプログラマーを本気で育てるSwift超入門iosプログラマーへの第一歩
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮
 
図解入門最新マーケティング・リサーチがよーくわかる本(3)
図解入門最新マーケティング・リサーチがよーくわかる本(3)図解入門最新マーケティング・リサーチがよーくわかる本(3)
図解入門最新マーケティング・リサーチがよーくわかる本(3)
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会
 
kagami_comput2015_12
kagami_comput2015_12kagami_comput2015_12
kagami_comput2015_12
 
科学技術コミュニケーションの原点と座標軸20150517(本編)
科学技術コミュニケーションの原点と座標軸20150517(本編)科学技術コミュニケーションの原点と座標軸20150517(本編)
科学技術コミュニケーションの原点と座標軸20150517(本編)
 
kagami_comput2016_08
kagami_comput2016_08kagami_comput2016_08
kagami_comput2016_08
 
kagami_comput2016_06
kagami_comput2016_06kagami_comput2016_06
kagami_comput2016_06
 
kagami_comput2016_09
kagami_comput2016_09kagami_comput2016_09
kagami_comput2016_09
 
kagami_comput2016_05
kagami_comput2016_05kagami_comput2016_05
kagami_comput2016_05
 
kagami_comput2016_07
kagami_comput2016_07kagami_comput2016_07
kagami_comput2016_07
 
3_C言語入門 - C言語の基本
3_C言語入門 - C言語の基本3_C言語入門 - C言語の基本
3_C言語入門 - C言語の基本
 

Mehr von Yoshio Hanawa

自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみた自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみたYoshio Hanawa
 
Zend VMにおける例外の実装
Zend VMにおける例外の実装Zend VMにおける例外の実装
Zend VMにおける例外の実装Yoshio Hanawa
 
Zend VMにおける例外の実装
Zend VMにおける例外の実装Zend VMにおける例外の実装
Zend VMにおける例外の実装Yoshio Hanawa
 
ぼくのかんがえる
さいきょうの銀行振込
ぼくのかんがえる
さいきょうの銀行振込ぼくのかんがえる
さいきょうの銀行振込
ぼくのかんがえる
さいきょうの銀行振込Yoshio Hanawa
 
「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」Yoshio Hanawa
 
浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話Yoshio Hanawa
 
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことPHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことYoshio Hanawa
 
GitHubからお金をもらった話
GitHubからお金をもらった話GitHubからお金をもらった話
GitHubからお金をもらった話Yoshio Hanawa
 
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べたiOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べたYoshio Hanawa
 
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係Yoshio Hanawa
 
家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそう家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそうYoshio Hanawa
 
Laungage Update PHP編
Laungage Update PHP編Laungage Update PHP編
Laungage Update PHP編Yoshio Hanawa
 
PHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作るPHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作るYoshio Hanawa
 
GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話Yoshio Hanawa
 
php-buildがいかに便利かを力説する
php-buildがいかに便利かを力説するphp-buildがいかに便利かを力説する
php-buildがいかに便利かを力説するYoshio Hanawa
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたYoshio Hanawa
 
PHP7の拡張モジュール事情
PHP7の拡張モジュール事情PHP7の拡張モジュール事情
PHP7の拡張モジュール事情Yoshio Hanawa
 
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニックPHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニックYoshio Hanawa
 
PHPの正規表現と最長一致
PHPの正規表現と最長一致PHPの正規表現と最長一致
PHPの正規表現と最長一致Yoshio Hanawa
 
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイントPHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイントYoshio Hanawa
 

Mehr von Yoshio Hanawa (20)

自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみた自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみた
 
Zend VMにおける例外の実装
Zend VMにおける例外の実装Zend VMにおける例外の実装
Zend VMにおける例外の実装
 
Zend VMにおける例外の実装
Zend VMにおける例外の実装Zend VMにおける例外の実装
Zend VMにおける例外の実装
 
ぼくのかんがえる
さいきょうの銀行振込
ぼくのかんがえる
さいきょうの銀行振込ぼくのかんがえる
さいきょうの銀行振込
ぼくのかんがえる
さいきょうの銀行振込
 
「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」
 
浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話
 
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことPHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったこと
 
GitHubからお金をもらった話
GitHubからお金をもらった話GitHubからお金をもらった話
GitHubからお金をもらった話
 
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べたiOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
 
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係
 
家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそう家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそう
 
Laungage Update PHP編
Laungage Update PHP編Laungage Update PHP編
Laungage Update PHP編
 
PHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作るPHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作る
 
GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話
 
php-buildがいかに便利かを力説する
php-buildがいかに便利かを力説するphp-buildがいかに便利かを力説する
php-buildがいかに便利かを力説する
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
 
PHP7の拡張モジュール事情
PHP7の拡張モジュール事情PHP7の拡張モジュール事情
PHP7の拡張モジュール事情
 
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニックPHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
 
PHPの正規表現と最長一致
PHPの正規表現と最長一致PHPの正規表現と最長一致
PHPの正規表現と最長一致
 
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイントPHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイント
 

浮動小数点数の話 2013年度版