[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