mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
merge revision(s) 55604,55612: [Backport #13138]
* numeric.c (flo_round): [EXPERIMENTAL] adjust the case that the receiver is close to the exact but unrepresentable middle value of two values in the given precision. http://d.hatena.ne.jp/hnw/20160702 numeric.c: round as double * numeric.c (flo_round): compare as double, not long double with i387. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@58513 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
44e329ea7f
commit
2dfde7e858
4 changed files with 24 additions and 6 deletions
|
@ -1,3 +1,10 @@
|
|||
Sun Apr 30 22:24:25 2017 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* numeric.c (flo_round): [EXPERIMENTAL] adjust the case that the
|
||||
receiver is close to the exact but unrepresentable middle value
|
||||
of two values in the given precision.
|
||||
http://d.hatena.ne.jp/hnw/20160702
|
||||
|
||||
Sun Apr 9 22:21:23 2017 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||
|
||||
thread.c: rb_thread_fd_close [ci skip]
|
||||
|
|
12
numeric.c
12
numeric.c
|
@ -1786,7 +1786,7 @@ static VALUE
|
|||
flo_round(int argc, VALUE *argv, VALUE num)
|
||||
{
|
||||
VALUE nd;
|
||||
double number, f;
|
||||
double number, f, x;
|
||||
int ndigits = 0;
|
||||
int binexp;
|
||||
enum {float_dig = DBL_DIG+2};
|
||||
|
@ -1828,8 +1828,14 @@ flo_round(int argc, VALUE *argv, VALUE num)
|
|||
return DBL2NUM(0);
|
||||
}
|
||||
f = pow(10, ndigits);
|
||||
return DBL2NUM(round(number * f) / f);
|
||||
}
|
||||
x = round(number * f);
|
||||
if (x > 0) {
|
||||
if ((double)((x + 0.5) / f) <= number) x += 1;
|
||||
}
|
||||
else {
|
||||
if ((double)((x - 0.5) / f) >= number) x -= 1;
|
||||
}
|
||||
return DBL2NUM(x / f);}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
|
|
|
@ -442,6 +442,11 @@ class TestFloat < Test::Unit::TestCase
|
|||
assert_raise(TypeError) {1.0.round(nil)}
|
||||
def (prec = Object.new).to_int; 2; end
|
||||
assert_equal(1.0, 0.998.round(prec))
|
||||
|
||||
assert_equal(+5.02, +5.015.round(2))
|
||||
assert_equal(-5.02, -5.015.round(2))
|
||||
assert_equal(+1.26, +1.255.round(2))
|
||||
assert_equal(-1.26, -1.255.round(2))
|
||||
end
|
||||
|
||||
VS = [
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
#define RUBY_VERSION "2.3.5"
|
||||
#define RUBY_RELEASE_DATE "2017-04-09"
|
||||
#define RUBY_PATCHLEVEL 303
|
||||
#define RUBY_RELEASE_DATE "2017-04-30"
|
||||
#define RUBY_PATCHLEVEL 304
|
||||
|
||||
#define RUBY_RELEASE_YEAR 2017
|
||||
#define RUBY_RELEASE_MONTH 4
|
||||
#define RUBY_RELEASE_DAY 9
|
||||
#define RUBY_RELEASE_DAY 30
|
||||
|
||||
#include "ruby/version.h"
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue