summaryrefslogtreecommitdiff
path: root/ext/bigdecimal
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-01-26 12:52:49 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-01-26 12:52:49 +0000
commit05d80e2fc68675be7339a7b5a909c90680ed23bc (patch)
treef41c0daba7de5cf74e1da9d8ec9e7f7aac3c5fb0 /ext/bigdecimal
parent96542c36786fb4dd6a94d0b83834f267478f2241 (diff)
* ext/bigdecimal/bigdecimal.c (VpCtoV): BigDecimal("0E200000000000")
was Infinity, not 0. * test/bigdecimal/test_bigdecimal.rb: add a test for above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26428 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/bigdecimal')
-rw-r--r--ext/bigdecimal/bigdecimal.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 38772f68f6..5a532e14e0 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -4009,13 +4009,14 @@ VpCtoV(Real *a, const char *int_chr, U_LONG ni, const char *frac, U_LONG nf, con
U_LONG i, j, ind_a, ma, mi, me;
U_LONG loc;
S_INT e,es, eb, ef;
- S_INT sign, signe;
+ S_INT sign, signe, exponent_overflow;
/* get exponent part */
e = 0;
ma = a->MaxPrec;
mi = ni;
me = ne;
signe = 1;
+ exponent_overflow = 0;
memset(a->frac, 0, ma * sizeof(U_LONG));
if(ne > 0) {
i = 0;
@@ -4031,12 +4032,8 @@ VpCtoV(Real *a, const char *int_chr, U_LONG ni, const char *frac, U_LONG nf, con
es = e*((S_INT)BASE_FIG);
e = e * 10 + exp_chr[i] - '0';
if(es>e*((S_INT)BASE_FIG)) {
- VpException(VP_EXCEPTION_INFINITY,"exponent overflow",0);
- sign = 1;
- if(int_chr[0] == '-') sign = -1;
- if(signe > 0) VpSetInf(a, sign);
- else VpSetZero(a, sign);
- return 1;
+ exponent_overflow = 1;
+ break;
}
++i;
}
@@ -4078,6 +4075,16 @@ VpCtoV(Real *a, const char *int_chr, U_LONG ni, const char *frac, U_LONG nf, con
eb = e / ((S_INT)BASE_FIG);
+ if(exponent_overflow) {
+ int zero = 1;
+ for( ; i < mi && zero; i++) zero = int_chr[i] == '0';
+ for(i = 0; i < nf && zero; i++) zero = frac[i] == '0';
+ if(!zero && signe > 0) VpSetInf(a, sign);
+ else VpSetZero(a, sign);
+ VpException(VP_EXCEPTION_INFINITY,"exponent overflow",0);
+ return 1;
+ }
+
ind_a = 0;
while(i < mi) {
a->frac[ind_a] = 0;