check for overflows in the remainder calculations ...

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@10124 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Linas Vepstas 2004-06-30 02:37:05 +00:00
parent 812fbb094f
commit 5a101b3354

View File

@ -792,47 +792,88 @@ gnc_numeric_convert(gnc_numeric in, gint64 denom, gint how)
break; break;
case GNC_HOW_RND_ROUND_HALF_DOWN: case GNC_HOW_RND_ROUND_HALF_DOWN:
if(denom_neg) { if(denom_neg)
if((2 * remainder) > in.denom*denom) { {
if((2 * remainder) > in.denom*denom)
{
out.num = out.num + 1; out.num = out.num + 1;
} }
} }
else if((2 * remainder) > temp.denom) { else if((2 * remainder) > temp.denom)
{
out.num = out.num + 1;
}
/* check that 2*remainder didn't over-flow */
else if (((2 * remainder) < remainder) &&
(remainder > (temp.denom / 2)))
{
out.num = out.num + 1; out.num = out.num + 1;
} }
break; break;
case GNC_HOW_RND_ROUND_HALF_UP: case GNC_HOW_RND_ROUND_HALF_UP:
if(denom_neg) { if(denom_neg)
if((2 * remainder) >= in.denom*denom) { {
if((2 * remainder) >= in.denom*denom)
{
out.num = out.num + 1; out.num = out.num + 1;
} }
} }
else if((2 * remainder ) >= temp.denom) { else if((2 * remainder ) >= temp.denom)
{
out.num = out.num + 1;
}
/* check that 2*remainder didn't over-flow */
else if (((2 * remainder) < remainder) &&
(remainder >= (temp.denom / 2)))
{
out.num = out.num + 1; out.num = out.num + 1;
} }
break; break;
case GNC_HOW_RND_ROUND: case GNC_HOW_RND_ROUND:
if(denom_neg) { if(denom_neg)
if((2 * remainder) > in.denom*denom) { {
if((2 * remainder) > in.denom*denom)
{
out.num = out.num + 1; out.num = out.num + 1;
} }
else if((2 * remainder) == in.denom*denom) { else if((2 * remainder) == in.denom*denom)
if(out.num % 2) { {
if(out.num % 2)
{
out.num = out.num + 1; out.num = out.num + 1;
} }
} }
} }
else { else
if((2 * remainder ) > temp.denom) { {
if((2 * remainder ) > temp.denom)
{
out.num = out.num + 1; out.num = out.num + 1;
} }
else if((2 * remainder) == temp.denom) { /* check that 2*remainder didn't over-flow */
if(out.num % 2) { else if (((2 * remainder) < remainder) &&
(remainder > (temp.denom / 2)))
{
out.num = out.num + 1;
}
else if((2 * remainder) == temp.denom)
{
if(out.num % 2)
{
out.num = out.num + 1; out.num = out.num + 1;
} }
} }
/* check that 2*remainder didn't over-flow */
else if (((2 * remainder) < remainder) &&
(remainder == (temp.denom / 2)))
{
if(out.num % 2)
{
out.num = out.num + 1;
}
}
} }
break; break;