mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
numeric.c: Fix negative step with float components
* numeric.c (ruby_float_step): fix negative step with float components. * test/ruby/test_numeric.c (test_step_bug15537): add tests. * test/ruby/test_range.c (test_step_bug15537): add tests. [Bug #15537] [ruby-core:91101] From: shuujii (Shuji KOBAYASHI) <shuujii@gmail.com> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66914 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
c56f61161a
commit
161ece4795
3 changed files with 21 additions and 2 deletions
|
@ -2514,9 +2514,9 @@ int
|
|||
ruby_float_step(VALUE from, VALUE to, VALUE step, int excl, int allow_endless)
|
||||
{
|
||||
if (RB_TYPE_P(from, T_FLOAT) || RB_TYPE_P(to, T_FLOAT) || RB_TYPE_P(step, T_FLOAT)) {
|
||||
double beg = NUM2DBL(from);
|
||||
double end = (allow_endless && NIL_P(to)) ? HUGE_VAL : NUM2DBL(to);
|
||||
double unit = NUM2DBL(step);
|
||||
double beg = NUM2DBL(from);
|
||||
double end = (allow_endless && NIL_P(to)) ? (unit < 0 ? -1 : 1)*HUGE_VAL : NUM2DBL(to);
|
||||
double n = ruby_float_step_size(beg, end, unit, excl);
|
||||
long i;
|
||||
|
||||
|
|
|
@ -339,6 +339,20 @@ class TestNumeric < Test::Unit::TestCase
|
|||
assert_step [bignum]*4, [bignum, by: 0, to: 0], inf: true
|
||||
end
|
||||
|
||||
def test_step_bug15537
|
||||
assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10.0, 1, -2]
|
||||
assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10.0, to: 1, by: -2]
|
||||
assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10.0, 1, -2]
|
||||
assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10, to: 1.0, by: -2]
|
||||
assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10, 1.0, -2]
|
||||
|
||||
assert_step [10.0, 9.0, 8.0, 7.0], [10, by: -1.0], inf: true
|
||||
assert_step [10.0, 9.0, 8.0, 7.0], [10, by: -1.0, to: nil], inf: true
|
||||
assert_step [10.0, 9.0, 8.0, 7.0], [10, nil, -1.0], inf: true
|
||||
assert_step [10.0, 9.0, 8.0, 7.0], [10.0, by: -1], inf: true
|
||||
assert_step [10.0, 9.0, 8.0, 7.0], [10.0, nil, -1], inf: true
|
||||
end
|
||||
|
||||
def test_num2long
|
||||
assert_raise(TypeError) { 1 & nil }
|
||||
assert_raise(TypeError) { 1 & 1.0 }
|
||||
|
|
|
@ -322,6 +322,11 @@ class TestRange < Test::Unit::TestCase
|
|||
assert_equal(["a", "b", "c"], a)
|
||||
end
|
||||
|
||||
def test_step_bug15537
|
||||
assert_equal([10.0, 9.0, 8.0, 7.0], (10 ..).step(-1.0).take(4))
|
||||
assert_equal([10.0, 9.0, 8.0, 7.0], (10.0 ..).step(-1).take(4))
|
||||
end
|
||||
|
||||
def test_percent_step
|
||||
aseq = (1..10) % 2
|
||||
assert_equal(Enumerator::ArithmeticSequence, aseq.class)
|
||||
|
|
Loading…
Add table
Reference in a new issue