[Gnucash-changes] check for overflows in the remainder calculations
...
Linas Vepstas
linas at cvs.gnucash.org
Tue Jun 29 22:37:05 EDT 2004
Log Message:
-----------
check for overflows in the remainder calculations ...
Modified Files:
--------------
gnucash/src/engine:
gnc-numeric.c
Revision Data
-------------
Index: gnc-numeric.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/gnc-numeric.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -Lsrc/engine/gnc-numeric.c -Lsrc/engine/gnc-numeric.c -u -r1.48 -r1.49
--- src/engine/gnc-numeric.c
+++ src/engine/gnc-numeric.c
@@ -792,47 +792,88 @@
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;
More information about the gnucash-changes
mailing list