1
0
Fork 0
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:
mrkn 2019-01-24 05:30:42 +00:00
parent c56f61161a
commit 161ece4795
3 changed files with 21 additions and 2 deletions

View file

@ -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;

View file

@ -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 }

View file

@ -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)