ruby-changes:5622
From: shyouhei <ko1@a...>
Date: Fri, 13 Jun 2008 12:05:55 +0900 (JST)
Subject: [ruby-changes:5622] Ruby:r17129 (ruby_1_8_5): merge revision(s) 15415:
shyouhei 2008-06-13 12:05:38 +0900 (Fri, 13 Jun 2008) New Revision: 17129 Modified files: branches/ruby_1_8_5/ChangeLog branches/ruby_1_8_5/ext/bigdecimal/bigdecimal.c branches/ruby_1_8_5/ext/bigdecimal/extconf.rb branches/ruby_1_8_5/version.h Log: merge revision(s) 15415: * ext/bigdecimal/bigdecimal.c (BigDecimal_to_f): use strtod() for more precision. [ruby-talk:290296] * ext/bigdecimal/bigdecimal.c (BASE_FIG): made constant. * ext/bigdecimal/extconf.rb: ditto. [ruby-dev:33658] http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_5/ext/bigdecimal/extconf.rb?r1=17129&r2=17128&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_5/ext/bigdecimal/bigdecimal.c?r1=17129&r2=17128&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_5/version.h?r1=17129&r2=17128&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_5/ChangeLog?r1=17129&r2=17128&diff_format=u Index: ruby_1_8_5/ext/bigdecimal/bigdecimal.c =================================================================== --- ruby_1_8_5/ext/bigdecimal/bigdecimal.c (revision 17128) +++ ruby_1_8_5/ext/bigdecimal/bigdecimal.c (revision 17129) @@ -586,19 +586,22 @@ { ENTER(1); Real *p; - double d, d2; + double d; S_LONG e; + char *buf; GUARD_OBJ(p,GetVpValue(self,1)); if(VpVtoD(&d, &e, p)!=1) return rb_float_new(d); + buf = ALLOCA_N(char,(unsigned int)VpNumOfChars(p,"E")); + VpToString(p, buf, 0, 0); errno = 0; - d2 = pow(10.0,(double)e); - if((errno == ERANGE && e>0) || (d2>1.0 && (fabs(d) > (DBL_MAX / d2)))) { + d = strtod(buf, 0); + if(errno == ERANGE) { VpException(VP_EXCEPTION_OVERFLOW,"BigDecimal to Float conversion",0); if(d>0.0) return rb_float_new(DBL_MAX); else return rb_float_new(-DBL_MAX); } - return rb_float_new(d*d2); + return rb_float_new(d); } /* The coerce method provides support for Ruby type coercion. It is not @@ -1062,7 +1065,7 @@ BigDecimal_remainder(VALUE self, VALUE r) /* remainder */ { VALUE f; - Real *d,*rv; + Real *d,*rv=0; f = BigDecimal_divremain(self,r,&d,&rv); if(f!=(VALUE)0) return f; return ToValue(rv); @@ -1516,7 +1519,7 @@ } else if(*psz=='+') { fPlus = 2; psz++; } - while(ch=*psz++) { + while((ch=*psz++)!=0) { if(ISSPACE(ch)) continue; if(!ISDIGIT(ch)) { if(ch=='F' || ch=='f') fmt = 1; /* F format */ @@ -1956,17 +1959,27 @@ static U_LONG gnPrecLimit = 0; /* Global upper limit of the precision newly allocated */ static U_LONG gfRoundMode = VP_ROUND_HALF_UP; /* Mode for general rounding operation */ +#ifndef BASE_FIG static U_LONG BASE_FIG = 4; /* =log10(BASE) */ static U_LONG BASE = 10000L; /* Base value(value must be 10**BASE_FIG) */ /* The value of BASE**2 + BASE must be represented */ /* within one U_LONG. */ static U_LONG HALF_BASE = 5000L;/* =BASE/2 */ -static S_LONG DBLE_FIG = 8; /* figure of double */ static U_LONG BASE1 = 1000L; /* =BASE/10 */ +#else +#ifndef BASE +#error BASE_FIG is defined but BASE is not +#endif +#define HALF_BASE (BASE/2) +#define BASE1 (BASE/10) +#endif +#ifndef DBLE_FIG +#define DBLE_FIG (DBL_DIG+1) /* figure of double */ +#endif static Real *VpConstOne; /* constant 1.0 */ static Real *VpPt5; /* constant 0.5 */ -static U_LONG maxnr = 100; /* Maximum iterations for calcurating sqrt. */ +#define maxnr 100UL /* Maximum iterations for calcurating sqrt. */ /* used in VpSqrt() */ /* ETC */ @@ -2083,8 +2096,8 @@ * (to let the compiler know they may be changed in outside * (... but not actually..)). */ -volatile double gZero_ABCED9B1_CE73__00400511F31D = 0.0; -volatile double gOne_ABCED9B4_CE73__00400511F31D = 1.0; +volatile const double gZero_ABCED9B1_CE73__00400511F31D = 0.0; +volatile const double gOne_ABCED9B4_CE73__00400511F31D = 1.0; static double Zero(void) { @@ -2356,16 +2369,15 @@ VP_EXPORT U_LONG VpInit(U_LONG BaseVal) { - U_LONG w; - double v; - /* Setup +/- Inf NaN -0 */ VpGetDoubleNaN(); VpGetDoublePosInf(); VpGetDoubleNegInf(); VpGetDoubleNegZero(); +#ifndef BASE_FIG if(BaseVal <= 0) { + U_LONG w; /* Base <= 0, then determine Base by calcuration. */ BASE = 1; while( @@ -2382,6 +2394,8 @@ BASE1 = BASE / 10; BASE_FIG = 0; while(BaseVal /= 10) ++BASE_FIG; +#endif + /* Allocates Vp constants. */ VpConstOne = VpAlloc((U_LONG)1, "1"); VpPt5 = VpAlloc((U_LONG)1, ".5"); @@ -2390,15 +2404,6 @@ gnAlloc = 0; #endif /* _DEBUG */ - /* Determine # of digits available in one 'double'. */ - - v = 1.0; - DBLE_FIG = 0; - while(v + 1.0 > 1.0) { - ++DBLE_FIG; - v /= 10; - } - #ifdef _DEBUG if(gfDebug) { printf("VpInit: BaseVal = %lu\n", BaseVal); @@ -2501,7 +2506,7 @@ psz = ALLOCA_N(char,strlen(szVal)+1); i = 0; ipn = 0; - while(psz[i]=szVal[ipn]) { + while((psz[i]=szVal[ipn])!=0) { if(ISDIGIT(psz[i])) ++ni; if(psz[i]=='_') { if(ni>0) {ipn++;continue;} @@ -2544,7 +2549,7 @@ else if(szVal[i] == '+') ++i; /* Skip digits */ ni = 0; /* digits in mantissa */ - while(v = szVal[i]) { + while((v = szVal[i]) != 0) { if(!ISDIGIT(v)) break; ++i; ++ni; @@ -2558,7 +2563,7 @@ if(szVal[i] == '.') { /* xxx. */ ++i; ipf = i; - while(v = szVal[i]) { /* get fraction part. */ + while((v = szVal[i]) != 0) { /* get fraction part. */ if(!ISDIGIT(v)) break; ++i; ++nf; @@ -2576,7 +2581,7 @@ ipe = i; v = szVal[i]; if((v == '-') ||(v == '+')) ++i; - while(v=szVal[i]) { + while((v=szVal[i])!=0) { if(!ISDIGIT(v)) break; ++i; ++ne; @@ -4428,7 +4433,7 @@ if(!VpHasVal(y)) return 0; /* Unable to round */ v = y->frac[0]; nf -= VpExponent(y)*BASE_FIG; - while(v=v/10) nf--; + while((v /= 10) != 0) nf--; nf += (BASE_FIG-1); return VpMidRound(y,f,nf); } Index: ruby_1_8_5/ext/bigdecimal/extconf.rb =================================================================== --- ruby_1_8_5/ext/bigdecimal/extconf.rb (revision 17128) +++ ruby_1_8_5/ext/bigdecimal/extconf.rb (revision 17129) @@ -1,2 +1,12 @@ require 'mkmf' + +base_fig = 0 +src = ("(BASE > 0) && " + "(BASE * (BASE+1)) > BASE && " + "(BASE * (BASE+1)) / BASE == (BASE+1)") +while try_static_assert(src, nil, "-DBASE=10#{'0'*base_fig}UL") + base_fig += 1 +end +$defs << "-DBASE=1#{'0'*base_fig}UL" << "-DBASE_FIG=#{base_fig}" + create_makefile('bigdecimal') Index: ruby_1_8_5/ChangeLog =================================================================== --- ruby_1_8_5/ChangeLog (revision 17128) +++ ruby_1_8_5/ChangeLog (revision 17129) @@ -1,3 +1,12 @@ +Fri Jun 13 12:03:31 2008 Nobuyoshi Nakada <nobu@r...> + + * ext/bigdecimal/bigdecimal.c (BigDecimal_to_f): use strtod() for more + precision. [ruby-talk:290296] + + * ext/bigdecimal/bigdecimal.c (BASE_FIG): made constant. + + * ext/bigdecimal/extconf.rb: ditto. [ruby-dev:33658] + Fri Jun 13 11:58:34 2008 Nobuyoshi Nakada <nobu@r...> * lib/irb.rb (IRB::Irb::eval_input): rescues Interrupt and other than Index: ruby_1_8_5/version.h =================================================================== --- ruby_1_8_5/version.h (revision 17128) +++ ruby_1_8_5/version.h (revision 17129) @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2008-06-13" #define RUBY_VERSION_CODE 185 #define RUBY_RELEASE_CODE 20080613 -#define RUBY_PATCHLEVEL 171 +#define RUBY_PATCHLEVEL 172 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/