mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	rational.c: fix for mathn
* rational.c (read_num, read_rat_nos): dispatch by the type of numerator, for mathn. [ruby-core:78893] [Bug #13084] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57232 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									699383492e
								
							
						
					
					
						commit
						ff93ad62bd
					
				
					 2 changed files with 31 additions and 5 deletions
				
			
		
							
								
								
									
										27
									
								
								rational.c
									
										
									
									
									
								
							
							
						
						
									
										27
									
								
								rational.c
									
										
									
									
									
								
							|  | @ -2358,11 +2358,22 @@ read_num(const char **s, int numsign, int strict, | ||||||
| 	    exp = rb_int_uminus(exp); | 	    exp = rb_int_uminus(exp); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (numsign == '-') |     if (numsign == '-') { | ||||||
| 	*num = rb_rational_uminus(*num); | 	if (RB_TYPE_P(*num, T_RATIONAL)) { | ||||||
|  | 	    *num = rb_rational_uminus(*num); | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 	    *num = rb_int_uminus(*num); | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|     if (!NIL_P(exp)) { |     if (!NIL_P(exp)) { | ||||||
| 	VALUE l = f_expt10(exp); | 	VALUE l = f_expt10(exp); | ||||||
| 	*num = nurat_mul(*num, l); | 	if (RB_TYPE_P(*num, T_RATIONAL)) { | ||||||
|  | 	    *num = nurat_mul(*num, l); | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 	    *num = rb_int_mul(*num, l); | ||||||
|  | 	} | ||||||
|     } |     } | ||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
|  | @ -2388,8 +2399,14 @@ read_rat_nos(const char **s, int sign, int strict, | ||||||
| 	(*s)++; | 	(*s)++; | ||||||
| 	if (!read_den(s, strict, &den)) | 	if (!read_den(s, strict, &den)) | ||||||
| 	    return 0; | 	    return 0; | ||||||
| 	if (!(FIXNUM_P(den) && FIX2LONG(den) == 1)) | 	if (!(FIXNUM_P(den) && FIX2LONG(den) == 1)) { | ||||||
| 	    *num = nurat_div(*num, den); | 	    if (RB_TYPE_P(*num, T_RATIONAL)) { | ||||||
|  | 		*num = nurat_div(*num, den); | ||||||
|  | 	    } | ||||||
|  | 	    else { | ||||||
|  | 		*num = rb_int_div(*num, den); | ||||||
|  | 	    } | ||||||
|  | 	} | ||||||
|     } |     } | ||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -180,4 +180,13 @@ class TestMathn < Test::Unit::TestCase | ||||||
|       assert_equal((-13/5), (-13/5).round(2, half: :down)) |       assert_equal((-13/5), (-13/5).round(2, half: :down)) | ||||||
|     EOS |     EOS | ||||||
|   end |   end | ||||||
|  | 
 | ||||||
|  |   def test_rational | ||||||
|  |     assert_separately(%w[-rmathn], "#{<<-"begin;"}\n#{<<-"end;"}", ignore_stderr: true) | ||||||
|  |     begin; | ||||||
|  |       assert_equal(-5, "-5".to_r) | ||||||
|  |       assert_equal(1, "5/5".to_r) | ||||||
|  |       assert_equal(5, "5e0".to_r) | ||||||
|  |     end; | ||||||
|  |   end | ||||||
| end | end | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 nobu
						nobu