* numeric.c (flo_round): fix inaccurate results.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31158 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
24055b89c8
commit
9b66922d7f
@ -1,3 +1,7 @@
|
|||||||
|
Wed Mar 23 08:07:33 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* numeric.c (flo_round): fix inaccurate results.
|
||||||
|
|
||||||
Wed Mar 23 00:12:16 2011 Tajima Akio <artonx@yahoo.co.jp>
|
Wed Mar 23 00:12:16 2011 Tajima Akio <artonx@yahoo.co.jp>
|
||||||
|
|
||||||
* win32/win32.c: wait process real termination after reading
|
* win32/win32.c: wait process real termination after reading
|
||||||
|
@ -126,6 +126,7 @@ VALUE rb_big_plus(VALUE, VALUE);
|
|||||||
VALUE rb_big_minus(VALUE, VALUE);
|
VALUE rb_big_minus(VALUE, VALUE);
|
||||||
VALUE rb_big_mul(VALUE, VALUE);
|
VALUE rb_big_mul(VALUE, VALUE);
|
||||||
VALUE rb_big_div(VALUE, VALUE);
|
VALUE rb_big_div(VALUE, VALUE);
|
||||||
|
VALUE rb_big_idiv(VALUE, VALUE);
|
||||||
VALUE rb_big_modulo(VALUE, VALUE);
|
VALUE rb_big_modulo(VALUE, VALUE);
|
||||||
VALUE rb_big_divmod(VALUE, VALUE);
|
VALUE rb_big_divmod(VALUE, VALUE);
|
||||||
VALUE rb_big_pow(VALUE, VALUE);
|
VALUE rb_big_pow(VALUE, VALUE);
|
||||||
|
13
numeric.c
13
numeric.c
@ -97,6 +97,9 @@ round(double x)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static VALUE fix_mul(VALUE x, VALUE y);
|
||||||
|
static VALUE int_pow(long x, unsigned long y);
|
||||||
|
|
||||||
static ID id_coerce, id_to_i, id_eq;
|
static ID id_coerce, id_to_i, id_eq;
|
||||||
|
|
||||||
VALUE rb_cNumeric;
|
VALUE rb_cNumeric;
|
||||||
@ -1492,7 +1495,15 @@ flo_round(int argc, VALUE *argv, VALUE num)
|
|||||||
if (ndigits < 0) number = 0;
|
if (ndigits < 0) number = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (ndigits < 0) number /= f;
|
if (ndigits < 0) {
|
||||||
|
if (fabs(number) < f) return INT2FIX(0);
|
||||||
|
if (!FIXABLE(number)) {
|
||||||
|
VALUE f10 = int_pow(10, -ndigits);
|
||||||
|
num = rb_big_idiv(rb_dbl2big(number), f10);
|
||||||
|
return FIXNUM_P(num) ? fix_mul(num, f10) : rb_big_mul(num, f10);
|
||||||
|
}
|
||||||
|
number /= f;
|
||||||
|
}
|
||||||
else number *= f;
|
else number *= f;
|
||||||
number = round(number);
|
number = round(number);
|
||||||
if (ndigits < 0) number *= f;
|
if (ndigits < 0) number *= f;
|
||||||
|
@ -320,6 +320,8 @@ class TestFloat < Test::Unit::TestCase
|
|||||||
assert_equal(1.110, 1.111.round(2))
|
assert_equal(1.110, 1.111.round(2))
|
||||||
assert_equal(11110.0, 11111.1.round(-1))
|
assert_equal(11110.0, 11111.1.round(-1))
|
||||||
assert_equal(11100.0, 11111.1.round(-2))
|
assert_equal(11100.0, 11111.1.round(-2))
|
||||||
|
|
||||||
|
assert_equal(10**300, 1.1e300.round(-300))
|
||||||
end
|
end
|
||||||
|
|
||||||
VS = [
|
VS = [
|
||||||
|
Loading…
x
Reference in New Issue
Block a user