mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	merge revision(s) 57227: [Backport #13078]
numeric.c: reduce fdiv * numeric.c (rb_int_fdiv_double): reduce first for more precise result. [ruby-core:78886] [Bug #13078] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@57840 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									2f1cc54d5f
								
							
						
					
					
						commit
						ea52cac148
					
				
					 4 changed files with 16 additions and 1 deletions
				
			
		|  | @ -1682,6 +1682,7 @@ VALUE rb_execarg_extract_options(VALUE execarg_obj, VALUE opthash); | ||||||
| void rb_execarg_setenv(VALUE execarg_obj, VALUE env); | void rb_execarg_setenv(VALUE execarg_obj, VALUE env); | ||||||
| 
 | 
 | ||||||
| /* rational.c (export) */ | /* rational.c (export) */ | ||||||
|  | VALUE rb_gcd(VALUE x, VALUE y); | ||||||
| VALUE rb_gcd_normal(VALUE self, VALUE other); | VALUE rb_gcd_normal(VALUE self, VALUE other); | ||||||
| #if defined(HAVE_LIBGMP) && defined(HAVE_GMP_H) | #if defined(HAVE_LIBGMP) && defined(HAVE_GMP_H) | ||||||
| VALUE rb_gcd_gmp(VALUE x, VALUE y); | VALUE rb_gcd_gmp(VALUE x, VALUE y); | ||||||
|  |  | ||||||
|  | @ -3614,6 +3614,13 @@ fix_fdiv_double(VALUE x, VALUE y) | ||||||
| double | double | ||||||
| rb_int_fdiv_double(VALUE x, VALUE y) | rb_int_fdiv_double(VALUE x, VALUE y) | ||||||
| { | { | ||||||
|  |     if (RB_INTEGER_TYPE_P(y) && !FIXNUM_ZERO_P(y)) { | ||||||
|  | 	VALUE gcd = rb_gcd(x, y); | ||||||
|  | 	if (!FIXNUM_ZERO_P(gcd)) { | ||||||
|  | 	    x = rb_int_idiv(x, gcd); | ||||||
|  | 	    y = rb_int_idiv(y, gcd); | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|     if (FIXNUM_P(x)) { |     if (FIXNUM_P(x)) { | ||||||
|         return fix_fdiv_double(x, y); |         return fix_fdiv_double(x, y); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -905,6 +905,13 @@ class Rational_Test < Test::Unit::TestCase | ||||||
|     assert_equal(5000000000.0, 10000000000.fdiv(2)) |     assert_equal(5000000000.0, 10000000000.fdiv(2)) | ||||||
|     assert_equal(0.5, 1.0.fdiv(2)) |     assert_equal(0.5, 1.0.fdiv(2)) | ||||||
|     assert_equal(0.25, Rational(1,2).fdiv(2)) |     assert_equal(0.25, Rational(1,2).fdiv(2)) | ||||||
|  | 
 | ||||||
|  |     a = 0xa42fcabf_c51ce400_00001000_00000000_00000000_00000000_00000000_00000000 | ||||||
|  |     b = 1<<1074 | ||||||
|  |     assert_equal(Rational(a, b).to_f, a.fdiv(b)) | ||||||
|  |     a = 3 | ||||||
|  |     b = 0x20_0000_0000_0001 | ||||||
|  |     assert_equal(Rational(a, b).to_f, a.fdiv(b)) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def test_ruby19 |   def test_ruby19 | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| #define RUBY_VERSION "2.4.0" | #define RUBY_VERSION "2.4.0" | ||||||
| #define RUBY_RELEASE_DATE "2017-03-11" | #define RUBY_RELEASE_DATE "2017-03-11" | ||||||
| #define RUBY_PATCHLEVEL 8 | #define RUBY_PATCHLEVEL 9 | ||||||
| 
 | 
 | ||||||
| #define RUBY_RELEASE_YEAR 2017 | #define RUBY_RELEASE_YEAR 2017 | ||||||
| #define RUBY_RELEASE_MONTH 3 | #define RUBY_RELEASE_MONTH 3 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 naruse
						naruse