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
53
誤差を知ろう
kosuke hino
July 30, 2024
Tweet
Share
More Decks by kosuke hino
See All by kosuke hino
リアルタイム通信を知る
kosukehino
0
60
hinoはhonoを知りたい
kosukehino
0
35
ポモドーロテクニック
kosukehino
0
27
AtCoder Heuristic Contestを知っているか?
kosukehino
0
67
AIでスライド爆速生成!
kosukehino
0
110
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.1k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
GitHub's CSS Performance
jonrohan
1030
460k
GraphQLとの向き合い方2022年版
quramy
43
13k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Optimising Largest Contentful Paint
csswizardry
33
2.9k
We Have a Design System, Now What?
morganepeng
50
7.2k
What's in a price? How to price your products and services
michaelherold
243
12k
Into the Great Unknown - MozCon
thekraken
33
1.5k
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