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

最近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

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です