Slide 1

Slide 1 text

なぜfloat で丸め誤差が生じるのか decimalとの違いを理解しよう

Slide 2

Slide 2 text

Agenda 2進数と小数 Float型の仕組み 丸め誤差 Decimal型の仕組み まとめ

Slide 3

Slide 3 text

2 進数と小数

Slide 4

Slide 4 text

2 進数と小数 コンピュータは2進数でデータを持つ 10 進数を2 進数で表すときは、 の足し合わせで表現 10進数に変換 2n ex)

Slide 5

Slide 5 text

2 進数と小数 10進数は の足し合わせで表現する 2n すべての整数は2進数で正確に表現できる

Slide 6

Slide 6 text

2 進数と小数 10進数は の足し合わせで表現する 2n すべての整数は2進数で正確に表現できる じゃあ小数はどうなの?

Slide 7

Slide 7 text

2 進数と小数 これらを足し合わせて小数点以下を表現 改めて、2 進数で10 進数を表すには の足し合わせで表現する 小数部分は、n = -1, -2, -3... で表現 2n

Slide 8

Slide 8 text

2 進数と小数 2 進数で小数は正確に表現できたり、できなかったりする 正確に表現できるとき 正確に表現できないとき 無限に続く

Slide 9

Slide 9 text

指数表記 非常に大きい or 小さい数を表現する際に、メモリを節約できる 2進数の場合 2 進数と小数

Slide 10

Slide 10 text

2 進数と小数 ここまでのまとめ 10進数は の足し合わせで表現する 2n 整数は2進数で正確に表現できる 小数は2進数で正確に表現できたり、できなかったりする

Slide 11

Slide 11 text

float 型の仕組み

Slide 12

Slide 12 text

の値 符号部 指数部 仮数部 float 型の仕組み float 型(32 ビット) 符号部(1 ビット) 指数部(8 ビット) 仮数部(23 ビット)

Slide 13

Slide 13 text

の値 符号部 指数部 仮数部 float 型の仕組み double 型(64 ビット) 実はRuby のFloat クラスはこっち 符号部(1 ビット) 指数部(11 ビット) 仮数部(52 ビット)

Slide 14

Slide 14 text

丸め誤差

Slide 15

Slide 15 text

丸め誤差 小数は2 進数で正確に表せないときがある 小数は有限の桁数で近似する( 丸める)

Slide 16

Slide 16 text

丸め誤差 double 型での例 52 ビット 四捨五入 指数表記

Slide 17

Slide 17 text

丸め誤差 Ruby で試す 浮動小数点数は近似されている( 丸められている) ことがわかる

Slide 18

Slide 18 text

丸め誤差 誤差による計算のずれ ex) 切り捨てや切り上げ 260.7100 を小数4 桁目を切り捨て ↓ 260.710 になるべきだが、260.709 になる

Slide 19

Slide 19 text

decimal 型の仕組み

Slide 20

Slide 20 text

の値 符号部 指数部 仮数部 decimal 型の仕組み 符号部(1 ビット) 指数部(7 ビット) 仮数部(96 ビット) decimal 型(128 ビット)

Slide 21

Slide 21 text

の値 符号部 指数部 仮数部 3 decimal 型の仕組み 整数 整数では誤差が生じないため、 decimal 型では丸め誤差は生じない 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 ※ 空白部は0 123 ex)

Slide 22

Slide 22 text

decimal 型の仕組み decimal 型のデメリット メモリ使用量が大きい 計算のパフォーマンスが遅い

Slide 23

Slide 23 text

まとめ 小数を2 進数で正確に表せないことが多い float やdouble で2 進数のまま表すと、丸め誤差が生じる decimal 型は10 進数で表現するので、丸め誤差が生じない

Slide 24

Slide 24 text

参考文献 https://www.cc.kyoto- su.ac.jp/~yamada/programming/float.html https://learn.microsoft.com/ja-jp/dotnet/visual- basic/language-reference/data-types/decimal-data-type