Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
なぜfloatで丸め誤差が生じるのか ~decimalとの違いを理解しよう~
Search
Haruki Yoshida
September 08, 2023
Technology
2.3k
4
Share
なぜfloatで丸め誤差が生じるのか ~decimalとの違いを理解しよう~
float型で誤差が生じる理由を2進数と小数の観点から解説しています。
Haruki Yoshida
September 08, 2023
More Decks by Haruki Yoshida
See All by Haruki Yoshida
Docker再入門 ~コンテナ・イメージ編~
yoshiyoshiharu
38
17k
トランザクションに歩み寄る ~はじめの第1歩編~
yoshiyoshiharu
6
3k
曳光弾型開発のススメ
yoshiyoshiharu
3
2.1k
Other Decks in Technology
See All in Technology
Unlocking the Apps
pimterry
0
200
「コーディング」しない人のための Claude Code 入門 ChatGPT の次の一歩 — 業務に組み込む 育成・共有・自動化
rfdnxbro
2
1.2k
プラットフォームエンジニア ワークショップ/ platform-workshop
databricksjapan
1
260
コードレビューを制するチームがソフトウェアデリバリーのフローを制す / Beyond Code Review: Distributing Its Responsibilities Across the SDLC
mtx2s
3
1k
「速く作る」から「正しく作る」へ ─ 生成AI時代の開発フロー改革の ロードマップと実行 ─
starfish719
0
6.8k
新アーキテクチャ「TiDB X」解説とDedicated比較 TiDB Cloud Premiumのゲーム運用活用を検証
staffrecruiter
0
110
製造業のクラウド活用最適解〜AI,DXを加速するデータ基盤の作り方〜
hamadakoji
0
350
「気づいたら仕事が終わっている」バクラクAIエージェント本番運用の裏側 / layerx-bakuraku-aie2026
yuya4
18
9.7k
TypeScript Compiler APIとPHP-Parserを活用し、TypeScriptとPHPで型を共有する
shuta13
0
350
Databricks における 生成AIガバナンスの実践
taka_aki
1
300
AI-DLCを活用した高品質・安全なAI駆動開発実践 / AI Driven Development with AI-DLC
yoshidashingo
0
130
LLMと共に進化するプロセスを目指して
ymatsuwitter
6
1.3k
Featured
See All Featured
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
190
The SEO Collaboration Effect
kristinabergwall1
1
470
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
360
Between Models and Reality
mayunak
4
320
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
460
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
150
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
400
How to Ace a Technical Interview
jacobian
281
24k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
600
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Transcript
なぜfloat で丸め誤差が生じるのか decimalとの違いを理解しよう
Agenda 2進数と小数 Float型の仕組み 丸め誤差 Decimal型の仕組み まとめ
2 進数と小数
2 進数と小数 コンピュータは2進数でデータを持つ 10 進数を2 進数で表すときは、 の足し合わせで表現 10進数に変換 2n ex)
2 進数と小数 10進数は の足し合わせで表現する 2n すべての整数は2進数で正確に表現できる
2 進数と小数 10進数は の足し合わせで表現する 2n すべての整数は2進数で正確に表現できる じゃあ小数はどうなの?
2 進数と小数 これらを足し合わせて小数点以下を表現 改めて、2 進数で10 進数を表すには の足し合わせで表現する 小数部分は、n = -1,
-2, -3... で表現 2n
2 進数と小数 2 進数で小数は正確に表現できたり、できなかったりする 正確に表現できるとき 正確に表現できないとき 無限に続く
指数表記 非常に大きい or 小さい数を表現する際に、メモリを節約できる 2進数の場合 2 進数と小数
2 進数と小数 ここまでのまとめ 10進数は の足し合わせで表現する 2n 整数は2進数で正確に表現できる 小数は2進数で正確に表現できたり、できなかったりする
float 型の仕組み
の値 符号部 指数部 仮数部 float 型の仕組み float 型(32 ビット) 符号部(1
ビット) 指数部(8 ビット) 仮数部(23 ビット)
の値 符号部 指数部 仮数部 float 型の仕組み double 型(64 ビット) 実はRuby
のFloat クラスはこっち 符号部(1 ビット) 指数部(11 ビット) 仮数部(52 ビット)
丸め誤差
丸め誤差 小数は2 進数で正確に表せないときがある 小数は有限の桁数で近似する( 丸める)
丸め誤差 double 型での例 52 ビット 四捨五入 指数表記
丸め誤差 Ruby で試す 浮動小数点数は近似されている( 丸められている) ことがわかる
丸め誤差 誤差による計算のずれ ex) 切り捨てや切り上げ 260.7100 を小数4 桁目を切り捨て ↓ 260.710 になるべきだが、260.709
になる
decimal 型の仕組み
の値 符号部 指数部 仮数部 decimal 型の仕組み 符号部(1 ビット) 指数部(7 ビット)
仮数部(96 ビット) decimal 型(128 ビット)
の値 符号部 指数部 仮数部 3 decimal 型の仕組み 整数 整数では誤差が生じないため、 decimal
型では丸め誤差は生じない 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 ※ 空白部は0 123 ex)
decimal 型の仕組み decimal 型のデメリット メモリ使用量が大きい 計算のパフォーマンスが遅い
まとめ 小数を2 進数で正確に表せないことが多い float やdouble で2 進数のまま表すと、丸め誤差が生じる decimal 型は10 進数で表現するので、丸め誤差が生じない
参考文献 https://www.cc.kyoto- su.ac.jp/~yamada/programming/float.html https://learn.microsoft.com/ja-jp/dotnet/visual- basic/language-reference/data-types/decimal-data-type