Slide 1

Slide 1 text

丸め誤差 発⽣の仕組みと向き合い⽅ =千歳ゆるい勉強会vol.4=

Slide 2

Slide 2 text

⾃⼰紹介 • えび🦐 • エンジニア2年⽣ • Swiftが好き…最近触らせてもらえていない… 最近の関⼼ • TDD : Swiftで⾊々いじっています。まだ腹落ちしていない。 • コンピュータはなぜ動いているのか

Slide 3

Slide 3 text

•以下の計算を試してください:

Slide 4

Slide 4 text

0.3 ?

Slide 5

Slide 5 text

答え: 0.30000000000000004

Slide 6

Slide 6 text

これが丸め誤差

Slide 7

Slide 7 text

今⽇は、丸め誤差発⽣の仕 組みと 向き合い⽅について お話しします。

Slide 8

Slide 8 text

⽬次 •浮動⼩数点数とはなにか •基数変換の⽅法をおさらい •浮動⼩数点数の優位性 •丸め誤差と付き合っていく •まとめ

Slide 9

Slide 9 text

Double = 浮動⼩数点数型の⼀種

Slide 10

Slide 10 text

浮動⼩数点数とは

Slide 11

Slide 11 text

浮動⼩数点数とは: 10進数の実数を、有限桁の2進数 の近似値で表現する⽅法

Slide 12

Slide 12 text

基数変換の⽅法をおさらい

Slide 13

Slide 13 text

整数部:整数を2で割り、余りを下から上へ並べる

Slide 14

Slide 14 text

⼩数部:⼩数部分に2を掛け、積の整数部分 を順に取り出す

Slide 15

Slide 15 text

0.1を⼆進数にする:

Slide 16

Slide 16 text

循環している…?

Slide 17

Slide 17 text

浮動⼩数点数: 10進数の実数を、有限桁の2進数 の近似値で表現する⽅法

Slide 18

Slide 18 text

丸め誤差は、⼩数を有限桁の⼆進 数で表現できない時に発⽣する

Slide 19

Slide 19 text

浮動⼩数点数の優位性

Slide 20

Slide 20 text

浮動⼩数点数の優位性: 効率的なメモリ利⽤と ⾼速な演算が可能

Slide 21

Slide 21 text

ベンチマークを取ってみる

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

•Double: 0.00000003327274322509766秒 •Decimal: 0.000000044722795486450195秒 確かに、 Doubleのほうが(若⼲)早い

Slide 24

Slide 24 text

丸め誤差と付き合う

Slide 25

Slide 25 text

丸め誤差を回避する⽅法: •整数で計算した後、10で割る •Decimalを使⽤する

Slide 26

Slide 26 text

整数で計算した後、10で割る: •10進数の整数を2進数に変換する際は常に正 確に基数変換できる •なぜなら、任意の値を2の累乗の組み合わせ として表現するだけで済むから

Slide 27

Slide 27 text

(補⾜) 2の累乗:

Slide 28

Slide 28 text

Decimalを使⽤する: •10進数で計算すれば、何も問題ないよね!!

Slide 29

Slide 29 text

丸め誤差を許容する: •数値の正確さが必須ではない時は、許容する

Slide 30

Slide 30 text

まとめ: •丸め誤差は、10進数を2進数で表現する際に 発⽣する計算誤差です。 •浮動⼩数点数は、誤差を伴うものの、⾼速で メモリ効率が良いため、広く使⽤されていま す。 •丸め誤差の回避⽅法として、整数で計算後に 10で割る⽅法や、Decimal型を使⽤する⼿段 があります。

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

②以降で話したいこと •なぜ浮動⼩数点数は速いのか •丸め誤差を許容する 内部の動き •IEEE 754標準について