最近Rubyを嗜む程度で始めたのですが、irbでいろいろやってたら不思議な現象が起こった。10進の浮動小数点の不思議な話。たぶん、2進数、変数、最適化とかのキーワードで調べてもうちょい突き進んでいけば分かるかもしれないけれど、ひとまず区切りを。
計算から。
irb(main):001:0> 1+1
=> 2
irb(main):004:0* 1/3
=> 0
irb(main):005:0> 1.000/3.000
=> 0.3333333333333333
まぁ、ここまでは分かる。
3.3になにがあるのか。
色々試したれど、3.3になるものは0000003がお尻につくらしい。
irb(main):007:0* 1.1+2.2
=> 3.3000000000000003
irb(main):001:0> 3.3+3.3
=> 6.6
irb(main):005:0> 1.2+2.3
=> 3.5
irb(main):006:0> 2.2+3.3
=> 5.5
irb(main):008:0* 1.0+2.0
=> 3.0
irb(main):012:0* 4.4+5.5
=> 9.9
irb(main):014:0* 2.2+3.3
=> 5.5
irb(main):017:0* 1.0+2.2
=> 3.2
irb(main):018:0> 1.1+2.0
=> 3.1
3.33はいいらしい。
irb(main):020:0> 1.11+2.22
=> 3.33
3.30はダメ。3.3は弱点なのだろうか。
irb(main):021:0> 1.10+2.20
=> 3.3000000000000003
0.3もダメだったw
irb(main):024:0> 0.1+0.1+0.1
=> 0.30000000000000004
あ、0.3がダメなのか!と分かったようなことを言ったが。
irb(main):002:0* 0.1+0.2
=> 0.30000000000000004
そうでもなかった (´・ω・`)
irb(main):001:0> 0.09 + 0.21
=> 0.3
では今度は0になる予定のもの。
irb(main):026:0> 0.3-0.3
=> 0.0
これは0じゃないらしい。
irb(main):025:0> 0.1+0.1+0.1-0.3
=> 5.551115123125783e-17
こんなことも起きる。
irb(main):004:0> 111.1 + 111.1 + 111.1
=> 333.29999999999995
irb(main):005:0> 0.1 + 0.1 + 0.1
=> 0.30000000000000004