[Gnucash-changes] fix yet another intermediate-math overflow bug.
Linas Vepstas
linas at cvs.gnucash.org
Sat Jul 3 23:56:40 EDT 2004
Log Message:
-----------
fix yet another intermediate-math overflow bug.
comparing two numbers gave incorrect results because
intermediate calculation overflowed
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.52
retrieving revision 1.53
diff -Lsrc/engine/gnc-numeric.c -Lsrc/engine/gnc-numeric.c -u -r1.52 -r1.53
--- src/engine/gnc-numeric.c
+++ src/engine/gnc-numeric.c
@@ -216,24 +216,36 @@
********************************************************************/
int
-gnc_numeric_compare(gnc_numeric a, gnc_numeric b) {
- gint64 ab, ba;
+gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
+{
+ gint64 aa, bb;
- if(gnc_numeric_check(a) || gnc_numeric_check(b)) {
+ if(gnc_numeric_check(a) || gnc_numeric_check(b))
+ {
return 0;
}
- ab = a.num * b.denom;
- ba = b.num * a.denom;
- if(ab == ba) {
- return 0;
- }
- else if(ab > ba) {
- return 1;
- }
- else {
+ if (a.denom == b.denom)
+ {
+ if(a.num == b.num) return 0;
+ if(a.num > b.num) return 1;
return -1;
}
+
+ if ((a.denom > 0) && (b.denom > 0))
+ {
+ /* Avoid overflows using 128-bit intermediate math */
+ qofint128 l = mult128 (a.num, b.denom);
+ qofint128 r = mult128 (b.num, a.denom);
+ return cmp128 (l,r);
+ }
+
+ aa = a.num * a.denom;
+ bb = b.num * b.denom;
+
+ if(aa == bb) return 0;
+ if(aa > bb) return 1;
+ return -1;
}
More information about the gnucash-changes
mailing list