From 5a101b3354a1e13734f210c0786633d9b7af4e92 Mon Sep 17 00:00:00 2001 From: Linas Vepstas Date: Wed, 30 Jun 2004 02:37:05 +0000 Subject: [PATCH] check for overflows in the remainder calculations ... git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@10124 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/engine/gnc-numeric.c | 69 ++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/src/engine/gnc-numeric.c b/src/engine/gnc-numeric.c index 43de0ea213..8488342b77 100644 --- a/src/engine/gnc-numeric.c +++ b/src/engine/gnc-numeric.c @@ -792,47 +792,88 @@ gnc_numeric_convert(gnc_numeric in, gint64 denom, gint how) break; case GNC_HOW_RND_ROUND_HALF_DOWN: - if(denom_neg) { - if((2 * remainder) > in.denom*denom) { + if(denom_neg) + { + if((2 * remainder) > in.denom*denom) + { 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; } break; case GNC_HOW_RND_ROUND_HALF_UP: - if(denom_neg) { - if((2 * remainder) >= in.denom*denom) { + if(denom_neg) + { + if((2 * remainder) >= in.denom*denom) + { 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; } break; case GNC_HOW_RND_ROUND: - if(denom_neg) { - if((2 * remainder) > in.denom*denom) { + if(denom_neg) + { + if((2 * remainder) > in.denom*denom) + { out.num = out.num + 1; } - else if((2 * remainder) == in.denom*denom) { - if(out.num % 2) { + else if((2 * remainder) == in.denom*denom) + { + if(out.num % 2) + { out.num = out.num + 1; } } } - else { - if((2 * remainder ) > temp.denom) { + else + { + if((2 * remainder ) > temp.denom) + { out.num = out.num + 1; } - else if((2 * remainder) == temp.denom) { - if(out.num % 2) { + /* check that 2*remainder didn't over-flow */ + 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; } } + /* 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;