10進の浮動小数点の不思議

色々と進めておりますが、まだ途中で書きあがっていないものばかりなので、小ネタ的なものを。

最近Rubyを嗜む程度で始めたのですが、irbでいろいろやってたら不思議な現象が起こった。
理由はあるのだろうけれど、調べていないので分かってません。

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

たぶん、2進数変数最適化とかのキーワードで調べていけばわかるかもしれないが時間がないのでやらないお。

 

Similar Posts:


Leave a Reply

Your email address will not be published. Required fields are marked *