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
誤差を知ろう
Search
kosuke hino
July 30, 2024
0
66
誤差を知ろう
kosuke hino
July 30, 2024
Tweet
Share
More Decks by kosuke hino
See All by kosuke hino
NotebookLMと散歩
kosukehino
0
15
リアルタイム通信を知る
kosukehino
0
94
hinoはhonoを知りたい
kosukehino
0
75
ポモドーロテクニック
kosukehino
0
34
AtCoder Heuristic Contestを知っているか?
kosukehino
0
100
AIでスライド爆速生成!
kosukehino
0
130
Featured
See All Featured
Producing Creativity
orderedlist
PRO
346
40k
Writing Fast Ruby
sferik
628
62k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Become a Pro
speakerdeck
PRO
29
5.4k
How to Think Like a Performance Engineer
csswizardry
25
1.7k
Visualization
eitanlees
146
16k
Raft: Consensus for Rubyists
vanstee
140
7k
Making Projects Easy
brettharned
116
6.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
Designing for Performance
lara
610
69k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
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