[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