summaryrefslogtreecommitdiff
path: root/strings
diff options
context:
space:
mode:
authorunknown <serg@serg.mylan>2004-11-01 23:44:05 +0100
committerunknown <serg@serg.mylan>2004-11-01 23:44:05 +0100
commit076420c8d5ebfcdb25ca9685f1635637a63c501c (patch)
tree551873857d8c6fa52b34e66457a5533db6c1d520 /strings
parent40edf5bc6e3e8827239ccd527d877e932a4ca8d0 (diff)
downloadmariadb-git-076420c8d5ebfcdb25ca9685f1635637a63c501c.tar.gz
one more pre-division bug
Diffstat (limited to 'strings')
-rw-r--r--strings/decimal.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/strings/decimal.c b/strings/decimal.c
index 50e84d105c5..10257e22208 100644
--- a/strings/decimal.c
+++ b/strings/decimal.c
@@ -1275,7 +1275,7 @@ static int do_div_mod(decimal *from1, decimal *from2,
{
int frac1=ROUND_UP(from1->frac)*DIG_PER_DEC1, prec1=from1->intg+frac1,
frac2=ROUND_UP(from2->frac)*DIG_PER_DEC1, prec2=from2->intg+frac2,
- error, i, intg0, frac0, len1, len2, dlen1;
+ error, i, intg0, frac0, len1, len2, dlen1, dintg;
dec1 *buf0, *buf1=from1->buf, *buf2=from2->buf, *tmp1,
*start2, *stop2, *stop1, *stop0, norm2, carry, *start1;
dec2 norm_factor, x, guess, y;
@@ -1318,10 +1318,14 @@ static int do_div_mod(decimal *from1, decimal *from2,
if ((scale_incr-= frac1 - from1->frac + frac2 - from2->frac) < 0)
scale_incr=0;
- if ((i=(prec1-frac1)-(prec2-frac2)+(*buf1 >= *buf2)) < 0) /* see below */
+ dintg=(prec1-frac1)-(prec2-frac2)+(*buf1 >= *buf2);
+ if (dintg < 0)
+ {
+ dintg/=DIG_PER_DEC1;
intg0=0;
+ }
else
- intg0=ROUND_UP(i);
+ intg0=ROUND_UP(dintg);
if (mod)
{
/* we're calculating N1 % N2.
@@ -1353,6 +1357,8 @@ static int do_div_mod(decimal *from1, decimal *from2,
}
buf0=to->buf;
stop0=buf0+intg0+frac0;
+ while (dintg++ < 0)
+ *buf0++=0;
len1=(i=ROUND_UP(prec1))+ROUND_UP(2*frac2+scale_incr+1);
if (!(tmp1=my_alloca(len1*sizeof(dec1))))
@@ -1943,6 +1949,7 @@ main()
test_dv("1", "3");
test_dv("1.000000000000", "3");
test_dv("1", "1");
+ test_dv("0.0123456789012345678912345", "9999999999");
printf("==== decimal_round ====\n");
test_ro("15.1",0,HALF_UP);