Slide 1

Slide 1 text

誤差を知ろう 株式会社 Inner Resource 檜野 浩輔

Slide 2

Slide 2 text

初めに • 最近タスクで⼩数点の計算を⾒る機会があって誤差を気にしたのと • 前回のLT会で2進数の話題が出て、コンピューターの誤差は2進数が 関係するという事で、誤差について話していきます! 2

Slide 3

Slide 3 text

丸め誤差とは? 10進数から2進数に変換した結果⽣じる誤差の事 3

Slide 4

Slide 4 text

コンピューターと2進数 • そもそもコンピューターは2進数でデータを持ちます。 • つまり我々がコード上は10進数で書いたとしても、コンピューター の処理では2進数に変換されて計算されています。 4

Slide 5

Slide 5 text

整数と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

Slide 6

Slide 6 text

⼩数と2進数 • ⼩数も同様に2!の⾜し合わせによって表現します • ⼩数部分はn=-1, -2, -3...となります。 • つまり以下ような数字の⾜し合わせです 2+" = 1 2" = 0.5 2+% = 1 2% = 0.25 2+* = 1 2* = 0.125 6

Slide 7

Slide 7 text

⼩数と2進数 • なんとなく察しがつくかと思いますが、⼩数は2進数で表現出来た り、出来なかったりします。 • Ex)0.75 "# = 2+" + 2+% = 0.11(%) • 0.1 "# = 2+) + 2+(+. . . = 0.000110011001100110011 …(%) • コンピューターは2進数の上限の桁数が決まっています • なので無限に続いてしまった場合は、途中で切ることになります。 • その結果、10進数から2進数に変換すると、元の10進数の値とは別 の値で2進数として表現する事なって誤差が⽣じる • 0.1を32桁にして表した時内部的にどうなるかの図 7

Slide 8

Slide 8 text

丸め誤差の対処⽅法 • BigDecimalを使⽤します • 簡単に説明すると⼩数点の計算を、整数を⽤いて計算出来るように 内部でよしなにやってくれます(今回は時間の都合で端折る) • デメリットとして普通の計算と⽐べて、メモリ使⽤量が増えて、計 算のパフォーマンスも遅くなってしまいます • なのでどこでも使って良い訳ではなく、限定的に使う必要がありま す。 8

Slide 9

Slide 9 text

⼊⼒データによる誤差とは? • 10進数の時点で割り切れない " * や" ' を計算の中で使う際に出る誤差 • Ex) 以下のような計算になる時 • 理系的な対処法としては、そのまま計算してはいけません。分⼦は 分⼦で、分⺟は分⺟で計算をして、最後に割り算を⾏って誤差を最 ⼩にする • つまり計算の順番を⼯夫して、割り算を⾏うのは最終的な回答を出 すときだけで、それまでは分数で計算をしていくという事 9

Slide 10

Slide 10 text

最後に • 今回は触れなかったですが、他にも誤差は、打ち切り誤差、桁落ち 誤差といったものもあります。 • ⾔語によっては桁落ち誤差の挙動だったり、数値を基にした真偽値 の挙動だったりが異なったりします。数値を扱う際には注意をしま しょう!! • 今回紹介したような対処⽅法を必ず使わないといけないというわけ ではないです。計算式を使って何かを表現する際には、⾔葉のまま 計算していいのか、⼯夫をする必要があるのか⾒極めていきましょ う!! 10