From: Samuel Kadolph Date: 2011-07-18T23:19:04+09:00 Subject: Re: Is this a float-bug or naive comprehension? --bcaec54ee8ea5154a004a858ae7d Content-Type: text/plain; charset=ISO-8859-1 This is how floating point math works. If you want exact values use decimals. http://en.wikipedia.org/wiki/Floating_point On Mon, Jul 18, 2011 at 10:15 AM, ZipiZap zap wrote: > Hello all, > > This is my first mail into the mailing list, so please be kind with any > errors, and please point them out so we can learn from them :) > > Last night I was messing with some simple arithmetic operations in irb, and > notice a funny thing: when I made subtractions (did not tested any other > operation) I did not got the expected results... > > It seems that the result of floating-point subtraction is not correct... as > if it had some residual value left in some deep decimal position... > This happens in both ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux] > and > ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux] > > I'm I missing something? > Or is it that the results are in fact incorrect and a bug should be > reported? > If so, should I report the bug into "http://redmine.ruby-lang.org/ > ", or where? > > Thanks in advance, Zipizap > > $ ruby -v > ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux]* > * > $ irb > ruby-1.8.7-p352 :001 > 2.45 - 1.45 > => 1.0 > ## > ## The last result is ok > ## > > ruby-1.8.7-p352 :002 > (0...10).map {|x| (x+0.9) - (x+0.7)} > => [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.200000000000001, > 0.200000000000001] > ## > ## The last results should all be 0.20 and they not only are different from > 0.20 but they are also ?!?different between themselves?!? > ## See the following "uniq" filter > ## This also happens in Ruby 1.9.2 > > ruby-1.8.7-p352 :003 > (0...10).map {|x| (x+0.9) - (x+0.7)}.uniq > => [0.2, 0.2, 0.2, 0.2, 0.200000000000001] > > > > > $ ruby -v > ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux] > > $ irb > ruby-1.9.2-p180 :002 > 2.45 - 1.45 > => 1.0000000000000002 > > ruby-1.9.2-p180 :005 > (0...10).map {|x| (x+0.9) - (x+0.7)} > => [0.20000000000000007, 0.19999999999999996, 0.19999999999999973, > 0.19999999999999973, 0.20000000000000018, 0.20000000000000018, > 0.20000000000000018, 0.20000000000000018, 0.20000000000000107, > 0.20000000000000107] > > ruby-1.9.2-p180 :006 > (0...10).map {|x| (x+0.9) - (x+0.7)}.uniq > => [0.20000000000000007, 0.19999999999999996, 0.19999999999999973, > 0.20000000000000018, 0.20000000000000107] > -- *Samuel Kadolph *E samuel@kadolph.com --bcaec54ee8ea5154a004a858ae7d--