summaryrefslogtreecommitdiff
path: root/numeric.c
diff options
context:
space:
mode:
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/numeric.c b/numeric.c
index 838ec43c29..99a1c7d60e 100644
--- a/numeric.c
+++ b/numeric.c
@@ -1808,10 +1808,21 @@ ruby_num_interval_step_size(VALUE from, VALUE to, VALUE step, int excl)
long delta, diff, result;
diff = FIX2LONG(step);
+ if (!diff) rb_num_zerodiv();
delta = FIX2LONG(to) - FIX2LONG(from);
if (excl) {
delta += (diff > 0 ? -1 : +1);
}
+ if (delta) {
+ if (diff < 0) {
+ if (delta > 0) return INT2FIX(0);
+ diff = -diff;
+ delta = -delta;
+ }
+ else {
+ if (delta < 0) return INT2FIX(0);
+ }
+ }
result = delta / diff;
return LONG2FIX(result >= 0 ? result + 1 : 0);
}