From: Vit Ondruch Date: 2011-08-30T17:52:20+09:00 Subject: [ruby-core:39198] [Ruby 1.9 - Bug #4576] Range#step miss the last value, if end-exclusive and has float number Issue #4576 has been updated by Vit Ondruch. File 0001-Fix-the-ronding-error-causing-wrong-evaluation-of-ra.patch added Usaku NAKAMURA wrote: > =begin > Hello, > > In message "[ruby-core:35804] [Ruby 1.9 - Bug #4576] Range#step miss the last value, if end-exclusive and has float number" > on Apr.18,2011 12:06:24, wrote: > > test_step_ruby_core_35753 seems depend on platform. > > On i686-linux it fails. > > Ah, I doubt it. Thank you. > > > > May i partially revert an testcase of test_step_ruby_core_35753? > > No. > I guess that 1.5 stepping doesn't have error. > Please test r31304. > > > Regards, > -- > U.Nakamura > =end Can we reopen this issue please? The fix of unit tests was wrong, fixing consequences instead of reasons. Moreover, it was not backported to 1.8.7, so we hit the issue again when preparing updated package for RHEL 6.2. You can find the discussion about the issue at [1] including proposed solution [2]. Could you please review and apply the attached patch and also backport it to 1.8.7? [1] https://bugzilla.redhat.com/show_bug.cgi?id=733372 [2] https://bugzilla.redhat.com/attachment.cgi?id=520552 ---------------------------------------- Bug #4576: Range#step miss the last value, if end-exclusive and has float number http://redmine.ruby-lang.org/issues/4576 Author: Joey Zhou Status: Closed Priority: Normal Assignee: Category: Target version: ruby -v: - =begin Hi, I find that: * if: range.exclude_end? == true * and: any one in [begin_obj, end_obj, step] is a true Float(f.to_i != f) * and: unless begin_obj + step*int == end_obj * then: the result will miss the last value. for example: p (1...6.3).step.to_a # => [1.0, 2.0, 3.0, 4.0, 5.0], no 6.0 p (1.1...6).step.to_a # => [1.1, 2.1, 3.1, 4.1], no 5.1 p (1...6).step(1.1).to_a # => [1.0, 2.1, 3.2, 4.300000000000001], no 5.4 p (1.0...6.6).step(1.9).to_a # => [1.0, 2.9], no 4.8 p (1.0...6.7).step(1.9).to_a # => [1.0, 2.9, 4.8] p (1.0...6.8).step(1.9).to_a # => [1.0, 2.9, 4.8], no 6.7 Maybe the #step is ok on integers, but there's something wrong if the range is end-exclusive and contain float numbers. =end -- http://redmine.ruby-lang.org