From f4de2059603088ff488480072f13322cd3670de2 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 10 Mar 2025 13:13:10 +0900 Subject: [PATCH] range.c (range_num_to_a): reduce integer to float conversion For big numbers (especially integers close to MRB_INT_MAX), float conversion may be lose precisions. So we try not to convert numbers, but just compare. --- src/range.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/range.c b/src/range.c index 0d2a551fa..547322794 100644 --- a/src/range.c +++ b/src/range.c @@ -382,27 +382,25 @@ range_num_to_a(mrb_state *mrb, mrb_value range) } #ifndef MRB_NO_FLOAT if (mrb_float_p(end)) { - mrb_float a = (mrb_float)mrb_integer(beg); + mrb_int a = mrb_integer(beg); mrb_float b = mrb_float(end); if (a > b) { return mrb_ary_new_capa(mrb, 0); } - ary = mrb_ary_new_capa(mrb, (mrb_int)(b - a) + 1); + mrb_int alen = (mrb_int)(b - a) + 1; + ary = mrb_ary_new_capa(mrb, alen); mrb_value *ptr = RARRAY_PTR(ary); - mrb_int i = 0; if (RANGE_EXCL(r)) { - while (a < b) { - ptr[i++] = mrb_int_value(mrb, (mrb_int)a); + for (mrb_int i=0; a