Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
誤差を知ろう
Search
kosuke hino
July 30, 2024
0
69
誤差を知ろう
kosuke hino
July 30, 2024
Tweet
Share
More Decks by kosuke hino
See All by kosuke hino
NotebookLMと散歩
kosukehino
0
19
リアルタイム通信を知る
kosukehino
0
97
hinoはhonoを知りたい
kosukehino
0
79
ポモドーロテクニック
kosukehino
0
37
AtCoder Heuristic Contestを知っているか?
kosukehino
0
110
AIでスライド爆速生成!
kosukehino
0
130
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
RailsConf 2023
tenderlove
30
1.3k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Balancing Empowerment & Direction
lara
5
800
Practical Orchestrator
shlominoach
190
11k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
A Modern Web Designer's Workflow
chriscoyier
698
190k
KATA
mclloyd
PRO
32
15k
Transcript
誤差を知ろう 株式会社 Inner Resource 檜野 浩輔
初めに • 最近タスクで⼩数点の計算を⾒る機会があって誤差を気にしたのと • 前回のLT会で2進数の話題が出て、コンピューターの誤差は2進数が 関係するという事で、誤差について話していきます! 2
丸め誤差とは? 10進数から2進数に変換した結果⽣じる誤差の事 3
コンピューターと2進数 • そもそもコンピューターは2進数でデータを持ちます。 • つまり我々がコード上は10進数で書いたとしても、コンピューター の処理では2進数に変換されて計算されています。 4
整数と2進数 • 10進数を2進数で表すときは、2!の⾜し合わせによって表現します • Ex) 123 "# = 1111011(%) =
1 & 2' + 1 & 2( + 1 & 2) + 1 & 2* + 0 & 2% + 1 & 2" + 1 & 2# = 64 + 32 + 26 + 8 + 0 + 2 + 1 • 全ての整数は2進数で表現が可能です • つまり整数の2進数の変換では、誤差は出ないという事です 5
⼩数と2進数 • ⼩数も同様に2!の⾜し合わせによって表現します • ⼩数部分はn=-1, -2, -3...となります。 • つまり以下ような数字の⾜し合わせです 2+"
= 1 2" = 0.5 2+% = 1 2% = 0.25 2+* = 1 2* = 0.125 6
⼩数と2進数 • なんとなく察しがつくかと思いますが、⼩数は2進数で表現出来た り、出来なかったりします。 • Ex)0.75 "# = 2+" +
2+% = 0.11(%) • 0.1 "# = 2+) + 2+(+. . . = 0.000110011001100110011 …(%) • コンピューターは2進数の上限の桁数が決まっています • なので無限に続いてしまった場合は、途中で切ることになります。 • その結果、10進数から2進数に変換すると、元の10進数の値とは別 の値で2進数として表現する事なって誤差が⽣じる • 0.1を32桁にして表した時内部的にどうなるかの図 7
丸め誤差の対処⽅法 • BigDecimalを使⽤します • 簡単に説明すると⼩数点の計算を、整数を⽤いて計算出来るように 内部でよしなにやってくれます(今回は時間の都合で端折る) • デメリットとして普通の計算と⽐べて、メモリ使⽤量が増えて、計 算のパフォーマンスも遅くなってしまいます •
なのでどこでも使って良い訳ではなく、限定的に使う必要がありま す。 8
⼊⼒データによる誤差とは? • 10進数の時点で割り切れない " * や" ' を計算の中で使う際に出る誤差 • Ex)
以下のような計算になる時 • 理系的な対処法としては、そのまま計算してはいけません。分⼦は 分⼦で、分⺟は分⺟で計算をして、最後に割り算を⾏って誤差を最 ⼩にする • つまり計算の順番を⼯夫して、割り算を⾏うのは最終的な回答を出 すときだけで、それまでは分数で計算をしていくという事 9
最後に • 今回は触れなかったですが、他にも誤差は、打ち切り誤差、桁落ち 誤差といったものもあります。 • ⾔語によっては桁落ち誤差の挙動だったり、数値を基にした真偽値 の挙動だったりが異なったりします。数値を扱う際には注意をしま しょう!! • 今回紹介したような対処⽅法を必ず使わないといけないというわけ
ではないです。計算式を使って何かを表現する際には、⾔葉のまま 計算していいのか、⼯夫をする必要があるのか⾒極めていきましょ う!! 10