mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	bigdecimal-brushup.patch from Tadashi Saito applied.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3763 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									273a14a44c
								
							
						
					
					
						commit
						3f8d7303c1
					
				
					 4 changed files with 41 additions and 46 deletions
				
			
		|  | @ -30,7 +30,7 @@ | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include "ruby.h" | #include <ctype.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  | @ -157,7 +157,7 @@ GetVpValue(VALUE v, int must) | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|     case T_FIXNUM: |     case T_FIXNUM: | ||||||
|         sprintf(szD, "%d", NUM2INT(v)); |         sprintf(szD, "%d", FIX2INT(v)); | ||||||
|         return VpCreateRbObject(VpBaseFig() * 2 + 1, szD); |         return VpCreateRbObject(VpBaseFig() * 2 + 1, szD); | ||||||
|     case T_FLOAT: |     case T_FLOAT: | ||||||
|         pv = VpCreateRbObject(VpDblFig()*2,"0"); |         pv = VpCreateRbObject(VpDblFig()*2,"0"); | ||||||
|  | @ -190,7 +190,7 @@ GetVpValue(VALUE v, int must) | ||||||
|         } |         } | ||||||
|         return pv; |         return pv; | ||||||
|     case T_STRING: |     case T_STRING: | ||||||
|         Check_SafeStr(v); |         SafeStringValue(v); | ||||||
|         return VpCreateRbObject(strlen(RSTRING(v)->ptr) + VpBaseFig() + 1, |         return VpCreateRbObject(strlen(RSTRING(v)->ptr) + VpBaseFig() + 1, | ||||||
|                                 RSTRING(v)->ptr); |                                 RSTRING(v)->ptr); | ||||||
|     case T_BIGNUM: |     case T_BIGNUM: | ||||||
|  | @ -274,13 +274,12 @@ BigDecimal_load(VALUE self, VALUE str) | ||||||
| { | { | ||||||
|     ENTER(2); |     ENTER(2); | ||||||
|     Real *pv; |     Real *pv; | ||||||
|     long len; |  | ||||||
|     unsigned char *pch; |     unsigned char *pch; | ||||||
|     unsigned char ch; |     unsigned char ch; | ||||||
|     unsigned long m=0; |     unsigned long m=0; | ||||||
| 
 | 
 | ||||||
|     Check_SafeStr(str); |     SafeStringValue(str); | ||||||
|     pch = rb_str2cstr(str, &len); |     pch = RSTRING(str)->ptr; | ||||||
|     /* First get max prec */ |     /* First get max prec */ | ||||||
|     while((*pch)!=(unsigned char)'\0' && (ch=*pch++)!=(unsigned char)':') { |     while((*pch)!=(unsigned char)'\0' && (ch=*pch++)!=(unsigned char)':') { | ||||||
|         if(ch<'0' || ch>'9') { |         if(ch<'0' || ch>'9') { | ||||||
|  | @ -304,7 +303,7 @@ BigDecimal_mode(VALUE self, VALUE which, VALUE val) | ||||||
|     if(TYPE(which)!=T_FIXNUM)  return INT2FIX(fo); |     if(TYPE(which)!=T_FIXNUM)  return INT2FIX(fo); | ||||||
|     if(val!=Qfalse && val!=Qtrue) return INT2FIX(fo); |     if(val!=Qfalse && val!=Qtrue) return INT2FIX(fo); | ||||||
| 
 | 
 | ||||||
|     f = (unsigned short)NUM2INT(which); |     f = (unsigned short)FIX2INT(which); | ||||||
|     if(f&VP_EXCEPTION_INFINITY) { |     if(f&VP_EXCEPTION_INFINITY) { | ||||||
|         fo = VpGetException(); |         fo = VpGetException(); | ||||||
|         VpSetException((unsigned short)((val==Qtrue)?(fo|VP_EXCEPTION_INFINITY): |         VpSetException((unsigned short)((val==Qtrue)?(fo|VP_EXCEPTION_INFINITY): | ||||||
|  | @ -345,7 +344,7 @@ GetPositiveInt(VALUE v) | ||||||
| { | { | ||||||
|     S_INT n; |     S_INT n; | ||||||
|     Check_Type(v, T_FIXNUM); |     Check_Type(v, T_FIXNUM); | ||||||
|     n = NUM2INT(v); |     n = FIX2INT(v); | ||||||
|     if(n <= 0) { |     if(n <= 0) { | ||||||
|         rb_fatal("Zero or negative argument not permitted."); |         rb_fatal("Zero or negative argument not permitted."); | ||||||
|     } |     } | ||||||
|  | @ -824,7 +823,7 @@ BigDecimal_assign2(VALUE self, VALUE n, VALUE f) | ||||||
|     Check_Type(f, T_FIXNUM); |     Check_Type(f, T_FIXNUM); | ||||||
|     GUARD_OBJ(cv,VpCreateRbObject(mx,"0")); |     GUARD_OBJ(cv,VpCreateRbObject(mx,"0")); | ||||||
|     GUARD_OBJ(av,GetVpValue(self,1)); |     GUARD_OBJ(av,GetVpValue(self,1)); | ||||||
|     VpAsgn(cv,av,NUM2INT(f)); |     VpAsgn(cv,av,FIX2INT(f)); | ||||||
|     return ToValue(cv); |     return ToValue(cv); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -947,7 +946,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self) | ||||||
|         iLoc = 0; |         iLoc = 0; | ||||||
|     } else { |     } else { | ||||||
|         Check_Type(vLoc, T_FIXNUM); |         Check_Type(vLoc, T_FIXNUM); | ||||||
|         iLoc = NUM2INT(vLoc); |         iLoc = FIX2INT(vLoc); | ||||||
|     } |     } | ||||||
|     sw = 2; |     sw = 2; | ||||||
| 
 | 
 | ||||||
|  | @ -972,7 +971,7 @@ BigDecimal_truncate(int argc, VALUE *argv, VALUE self) | ||||||
|         iLoc = 0; |         iLoc = 0; | ||||||
|     } else { |     } else { | ||||||
|         Check_Type(vLoc, T_FIXNUM); |         Check_Type(vLoc, T_FIXNUM); | ||||||
|         iLoc = NUM2INT(vLoc); |         iLoc = FIX2INT(vLoc); | ||||||
|     } |     } | ||||||
|     sw = 1; /* truncate */ |     sw = 1; /* truncate */ | ||||||
| 
 | 
 | ||||||
|  | @ -1010,7 +1009,7 @@ BigDecimal_floor(int argc, VALUE *argv, VALUE self) | ||||||
|         iLoc = 0; |         iLoc = 0; | ||||||
|     } else { |     } else { | ||||||
|         Check_Type(vLoc, T_FIXNUM); |         Check_Type(vLoc, T_FIXNUM); | ||||||
|         iLoc = NUM2INT(vLoc); |         iLoc = FIX2INT(vLoc); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     GUARD_OBJ(a,GetVpValue(self,1)); |     GUARD_OBJ(a,GetVpValue(self,1)); | ||||||
|  | @ -1033,7 +1032,7 @@ BigDecimal_ceil(int argc, VALUE *argv, VALUE self) | ||||||
|         iLoc = 0; |         iLoc = 0; | ||||||
|     } else { |     } else { | ||||||
|         Check_Type(vLoc, T_FIXNUM); |         Check_Type(vLoc, T_FIXNUM); | ||||||
|         iLoc = NUM2INT(vLoc); |         iLoc = FIX2INT(vLoc); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     GUARD_OBJ(a,GetVpValue(self,1)); |     GUARD_OBJ(a,GetVpValue(self,1)); | ||||||
|  | @ -1056,7 +1055,6 @@ BigDecimal_to_s(int argc, VALUE *argv, VALUE self) | ||||||
|     GUARD_OBJ(vp,GetVpValue(self,1)); |     GUARD_OBJ(vp,GetVpValue(self,1)); | ||||||
|     nc = VpNumOfChars(vp)+1; |     nc = VpNumOfChars(vp)+1; | ||||||
|     if(rb_scan_args(argc,argv,"01",&f)==1) { |     if(rb_scan_args(argc,argv,"01",&f)==1) { | ||||||
|         Check_Type(f, T_FIXNUM); |  | ||||||
|         mc  = GetPositiveInt(f); |         mc  = GetPositiveInt(f); | ||||||
|         nc += (nc + mc - 1) / mc + 1; |         nc += (nc + mc - 1) / mc + 1; | ||||||
|     } |     } | ||||||
|  | @ -1133,7 +1131,7 @@ BigDecimal_power(VALUE self, VALUE p) | ||||||
|     S_LONG mp, ma, n; |     S_LONG mp, ma, n; | ||||||
| 
 | 
 | ||||||
|     Check_Type(p, T_FIXNUM); |     Check_Type(p, T_FIXNUM); | ||||||
|     n = NUM2INT(p); |     n = FIX2INT(p); | ||||||
|     ma = n; |     ma = n; | ||||||
|     if(ma < 0)  ma = -ma; |     if(ma < 0)  ma = -ma; | ||||||
|     if(ma == 0) ma = 1; |     if(ma == 0) ma = 1; | ||||||
|  | @ -1163,7 +1161,7 @@ BigDecimal_new(int argc, VALUE *argv, VALUE self) | ||||||
|     } else { |     } else { | ||||||
|         mf = GetPositiveInt(nFig); |         mf = GetPositiveInt(nFig); | ||||||
|     } |     } | ||||||
|     Check_SafeStr(iniValue); |     SafeStringValue(iniValue); | ||||||
|     GUARD_OBJ(pv,VpNewRbClass(mf, RSTRING(iniValue)->ptr,self)); |     GUARD_OBJ(pv,VpNewRbClass(mf, RSTRING(iniValue)->ptr,self)); | ||||||
|     return ToValue(pv); |     return ToValue(pv); | ||||||
| } | } | ||||||
|  | @ -1176,7 +1174,7 @@ BigDecimal_limit(int argc, VALUE *argv, VALUE self) | ||||||
| 
 | 
 | ||||||
|     if(rb_scan_args(argc,argv,"01",&nFig)==1) { |     if(rb_scan_args(argc,argv,"01",&nFig)==1) { | ||||||
|         Check_Type(nFig, T_FIXNUM); |         Check_Type(nFig, T_FIXNUM); | ||||||
|         VpSetPrecLimit(NUM2INT(nFig)); |         VpSetPrecLimit(FIX2INT(nFig)); | ||||||
|     } |     } | ||||||
|     return nCur; |     return nCur; | ||||||
| } | } | ||||||
|  | @ -1195,7 +1193,7 @@ BigDecimal_e(VALUE self, VALUE nFig) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static VALUE | static VALUE | ||||||
| BigDecimal_pai(VALUE self, VALUE nFig) | BigDecimal_pi(VALUE self, VALUE nFig) | ||||||
| { | { | ||||||
|     ENTER(5); |     ENTER(5); | ||||||
|     Real *pv; |     Real *pv; | ||||||
|  | @ -1203,7 +1201,7 @@ BigDecimal_pai(VALUE self, VALUE nFig) | ||||||
| 
 | 
 | ||||||
|     mf = GetPositiveInt(nFig)+VpBaseFig()-1; |     mf = GetPositiveInt(nFig)+VpBaseFig()-1; | ||||||
|     GUARD_OBJ(pv,VpCreateRbObject(mf, "0")); |     GUARD_OBJ(pv,VpCreateRbObject(mf, "0")); | ||||||
|     VpPai(pv); |     VpPi(pv); | ||||||
|     return ToValue(pv); |     return ToValue(pv); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1293,7 +1291,7 @@ BigDecimal_assign(VALUE self, VALUE c, VALUE a, VALUE f) | ||||||
|     Check_Type(f, T_FIXNUM); |     Check_Type(f, T_FIXNUM); | ||||||
|     GUARD_OBJ(cv,GetVpValue(c,1)); |     GUARD_OBJ(cv,GetVpValue(c,1)); | ||||||
|     GUARD_OBJ(av,GetVpValue(a,1)); |     GUARD_OBJ(av,GetVpValue(a,1)); | ||||||
|     v = VpAsgn(cv,av,NUM2INT(f)); |     v = VpAsgn(cv,av,FIX2INT(f)); | ||||||
|     return INT2NUM(v); |     return INT2NUM(v); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1364,7 +1362,7 @@ Init_bigdecimal(void) | ||||||
|     rb_define_singleton_method(rb_cBigDecimal, "limit", BigDecimal_limit, -1); |     rb_define_singleton_method(rb_cBigDecimal, "limit", BigDecimal_limit, -1); | ||||||
|     rb_define_singleton_method(rb_cBigDecimal, "E", BigDecimal_e, 1); |     rb_define_singleton_method(rb_cBigDecimal, "E", BigDecimal_e, 1); | ||||||
|     rb_define_singleton_method(rb_cBigDecimal, "double_fig", BigDecimal_double_fig, 0); |     rb_define_singleton_method(rb_cBigDecimal, "double_fig", BigDecimal_double_fig, 0); | ||||||
|     rb_define_singleton_method(rb_cBigDecimal, "PI", BigDecimal_pai, 1); |     rb_define_singleton_method(rb_cBigDecimal, "PI", BigDecimal_pi, 1); | ||||||
|     rb_define_singleton_method(rb_cBigDecimal, "induced_from",BigDecimal_induced_from, 1); |     rb_define_singleton_method(rb_cBigDecimal, "induced_from",BigDecimal_induced_from, 1); | ||||||
|     rb_define_singleton_method(rb_cBigDecimal, "_load", BigDecimal_load, 1); |     rb_define_singleton_method(rb_cBigDecimal, "_load", BigDecimal_load, 1); | ||||||
| 
 | 
 | ||||||
|  | @ -3090,7 +3088,7 @@ VpFormatSt(char *psz,S_INT fFmt) | ||||||
| { | { | ||||||
|     U_LONG ie; |     U_LONG ie; | ||||||
|     U_LONG i, j; |     U_LONG i, j; | ||||||
|     S_INT nf; |     S_INT nf = 0; | ||||||
|     char ch; |     char ch; | ||||||
|     int fDot = 0; |     int fDot = 0; | ||||||
| 
 | 
 | ||||||
|  | @ -3871,10 +3869,10 @@ Exit: | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Calculates pai(=3.141592653589793238462........). |  * Calculates pi(=3.141592653589793238462........). | ||||||
|  */ |  */ | ||||||
| VP_EXPORT void | VP_EXPORT void | ||||||
| VpPai(Real *y) | VpPi(Real *y) | ||||||
| { | { | ||||||
|     Real *n, *n25, *n956, *n57121; |     Real *n, *n25, *n956, *n57121; | ||||||
|     Real *r, *f, *t; |     Real *r, *f, *t; | ||||||
|  | @ -3944,7 +3942,7 @@ VpPai(Real *y) | ||||||
|     VpFree(f); |     VpFree(f); | ||||||
|     VpFree(r); |     VpFree(r); | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|     printf("VpPai: # of iterations=%lu+%lu\n",i1,i2); |     printf("VpPi: # of iterations=%lu+%lu\n",i1,i2); | ||||||
| #endif /* _DEBUG */ | #endif /* _DEBUG */ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -4202,7 +4200,7 @@ SkipWhiteChar(char *szVal) | ||||||
|     char ch; |     char ch; | ||||||
|     U_LONG i = 0; |     U_LONG i = 0; | ||||||
|     while(ch = szVal[i++]) { |     while(ch = szVal[i++]) { | ||||||
|         if(IsWhiteChar(ch)) continue; |         if(ISSPACE(ch)) continue; | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|     return i - 1; |     return i - 1; | ||||||
|  |  | ||||||
|  | @ -126,7 +126,7 @@ VP_EXPORT int VpSqrt(Real *y,Real *x); | ||||||
| VP_EXPORT void VpRound(Real *y,Real *x,int sw,int f,int il); | VP_EXPORT void VpRound(Real *y,Real *x,int sw,int f,int il); | ||||||
| VP_EXPORT void VpFrac(Real *y,Real *x); | VP_EXPORT void VpFrac(Real *y,Real *x); | ||||||
| VP_EXPORT int VpPower(Real *y,Real *x,S_INT n); | VP_EXPORT int VpPower(Real *y,Real *x,S_INT n); | ||||||
| VP_EXPORT void VpPai(Real *y); | VP_EXPORT void VpPi(Real *y); | ||||||
| VP_EXPORT void VpExp1(Real *y); | VP_EXPORT void VpExp1(Real *y); | ||||||
| VP_EXPORT void VpExp(Real *y,Real *x); | VP_EXPORT void VpExp(Real *y,Real *x); | ||||||
| VP_EXPORT void VpSinCos(Real *psin,Real *pcos,Real *x); | VP_EXPORT void VpSinCos(Real *psin,Real *pcos,Real *x); | ||||||
|  | @ -141,8 +141,6 @@ VP_EXPORT int VPrint(FILE *fp,char *cntl_chr,Real *a); | ||||||
| #define Max(a, b)  (((a)>(b))?(a):(b)) | #define Max(a, b)  (((a)>(b))?(a):(b)) | ||||||
| #define Min(a, b)  (((a)>(b))?(b):(a)) | #define Min(a, b)  (((a)>(b))?(b):(a)) | ||||||
| 
 | 
 | ||||||
| #define IsWhiteChar(ch) (((ch==' ')||(ch=='\n')||(ch=='\t')||(ch=='\b'))?1:0) |  | ||||||
| 
 |  | ||||||
| #define VpMaxPrec(a)   ((a)->MaxPrec) | #define VpMaxPrec(a)   ((a)->MaxPrec) | ||||||
| #define VpPrec(a)      ((a)->Prec) | #define VpPrec(a)      ((a)->Prec) | ||||||
| #define VpGetFlag(a)   ((a)->flag) | #define VpGetFlag(a)   ((a)->flag) | ||||||
|  |  | ||||||
|  | @ -704,17 +704,17 @@ its dirmeter(pi=3.14159265358979....) using J.Machin's formula. | ||||||
| #!/usr/local/bin/ruby | #!/usr/local/bin/ruby | ||||||
| 
 | 
 | ||||||
| # | # | ||||||
| # pai.rb | # pi.rb | ||||||
| #  USAGE: ruby pai.rb n | #  USAGE: ruby pi.rb n | ||||||
| #   where n is the number of digits required. | #   where n is the number of digits required. | ||||||
| #  EX.: ruby pai.rb 1000 | #  EX.: ruby pi.rb 1000 | ||||||
| # | # | ||||||
| 
 | 
 | ||||||
| require "bigdecimal" | require "bigdecimal" | ||||||
| # | # | ||||||
| # Calculates 3.1415.... using J. Machin's formula. | # Calculates 3.1415.... using J. Machin's formula. | ||||||
| # | # | ||||||
| def pai(sig) # sig: Number of significant figures | def big_pi(sig) # sig: Number of significant figures | ||||||
|   exp    = -sig |   exp    = -sig | ||||||
|   pi     = BigDecimal::new("0") |   pi     = BigDecimal::new("0") | ||||||
|   two    = BigDecimal::new("2") |   two    = BigDecimal::new("2") | ||||||
|  | @ -746,8 +746,8 @@ def pai(sig) # sig: Number of significant figures | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| if $0 == __FILE__ | if $0 == __FILE__ | ||||||
|   print "PAI("+ARGV[0]+"):\n" |   print "PI("+ARGV[0]+"):\n" | ||||||
|   p pai(ARGV[0].to_i) |   p pi(ARGV[0].to_i) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| </PRE></CODE> | </PRE></CODE> | ||||||
|  |  | ||||||
|  | @ -303,12 +303,11 @@ a  | ||||||
| <LI>to_f</LI><BR> | <LI>to_f</LI><BR> | ||||||
| dup と全く同じです。 | dup と全く同じです。 | ||||||
| 同じ値の BigDecimal オブジェクトを生成します。 | 同じ値の BigDecimal オブジェクトを生成します。 | ||||||
| <LI>to_s</LI><BR> | <LI>to_s[(n)]</LI><BR> | ||||||
| 文字列に変換します("0.xxxxxEn"の形になります)。<BR> | 文字列に変換します("0.xxxxxEn"の形になります)。<BR> | ||||||
| s = a.to_s | s = a.to_s<BR> | ||||||
| <LI>to_s2</LI><BR> | n が指定されたときは、仮数部分を n 桁毎に空白で区切ります。<BR> | ||||||
| 文字列に変換します。仮数部分を n 桁毎に空白で区切ります。<BR> | s = a.to_s(n) | ||||||
| s = a.to_s2(n) |  | ||||||
| <LI>exponent</LI><BR> | <LI>exponent</LI><BR> | ||||||
| 指数部を整数値で返します。 | 指数部を整数値で返します。 | ||||||
| n = a.exponent <BR> | n = a.exponent <BR> | ||||||
|  | @ -644,17 +643,17 @@ c = a op b  | ||||||
| #!/usr/local/bin/ruby | #!/usr/local/bin/ruby | ||||||
| 
 | 
 | ||||||
| # | # | ||||||
| # pai.rb | # pi.rb | ||||||
| #  USAGE: ruby pai.rb n | #  USAGE: ruby pi.rb n | ||||||
| #   where n is the number of digits required. | #   where n is the number of digits required. | ||||||
| #  EX.: ruby pai.rb 1000 | #  EX.: ruby pi.rb 1000 | ||||||
| # | # | ||||||
| 
 | 
 | ||||||
| require "bigdecimal" | require "bigdecimal" | ||||||
| # | # | ||||||
| # Calculates 3.1415.... using J. Machin's formula. | # Calculates 3.1415.... using J. Machin's formula. | ||||||
| # | # | ||||||
| def pai(sig) # sig: Number of significant figures | def big_pi(sig) # sig: Number of significant figures | ||||||
|   exp    = -sig |   exp    = -sig | ||||||
|   pi     = BigDecimal::new("0") |   pi     = BigDecimal::new("0") | ||||||
|   two    = BigDecimal::new("2") |   two    = BigDecimal::new("2") | ||||||
|  | @ -686,8 +685,8 @@ def pai(sig) # sig: Number of significant figures | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| if $0 == __FILE__ | if $0 == __FILE__ | ||||||
|   print "PAI("+ARGV[0]+"):\n" |   print "PI("+ARGV[0]+"):\n" | ||||||
|   p pai(ARGV[0].to_i) |   p pi(ARGV[0].to_i) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| </PRE></CODE> | </PRE></CODE> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 shigek
						shigek