From: Yui NARUSE Date: 2011-09-16T16:18:59+09:00 Subject: [ruby-core:39579] [Ruby 1.9 - Bug #4576] Range#step miss the last value, if end-exclusive and has float number Issue #4576 has been updated by Yui NARUSE. Marc-Andre Lafortune wrote: > I re-committed as r33285 because > * Ruby should not keep it platform dependent with default compile > flags [ruby-core:39566], [ruby-core:28212] > * this commit has corresponding test [rubyspec:a9525edcd] Such style doesn't get consensus over the thread [ruby-core:39260]. > Before reverting a commit, please give an example of a problem it can > cause or provide a failing test. > > It a commit doesn't address all the possible scenarios, please re-open > the issue so additional patches can be made. See following results, it includes your ruby and RubySpec change: http://u32.rubyci.org/~chkbuild/ruby-trunk/log/20110915T230102Z.log.html.gz http://u64.rubyci.org/~chkbuild/ruby-trunk/log/20110915T230102Z.log.html.gz http://c5632.rubyci.org/~chkbuild/ruby-trunk/log/20110915T230102Z.log.html.gz http://c5664.rubyci.org/~chkbuild/ruby-trunk/log/20110915T230301Z.log.html.gz http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20110916T000500Z.log.html.gz Now I doubt your understanding of floating point number, so please learn it and check your understanding before recommit it. ---------------------------------------- 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: core Target version: 1.9.4 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