[Gnucash-changes] add random division checks

Linas Vepstas linas at cvs.gnucash.org
Sat Jun 26 02:39:39 EDT 2004


Log Message:
-----------
add random division checks

Modified Files:
--------------
    gnucash/src/engine/test:
        test-numeric.c

Revision Data
-------------
Index: test-numeric.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/test/test-numeric.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -Lsrc/engine/test/test-numeric.c -Lsrc/engine/test/test-numeric.c -u -r1.9 -r1.10
--- src/engine/test/test-numeric.c
+++ src/engine/test/test-numeric.c
@@ -15,7 +15,7 @@
 #include "test-engine-stuff.h"
 #include "gnc-numeric.h"
 
-#define NREPS 1000
+#define NREPS 2000
 
 static char *
 gnc_numeric_print(gnc_numeric in) 
@@ -489,8 +489,8 @@
 						 a, b, "expected %s got %s = %s * %s for multiply");
 
 	/* Multiply some random numbers.  This test presumes that
-	 * RAND_MAX is less than 2^32 
-    */
+	 * RAND_MAX is approx 2^32 
+	 */
 	int i;
 	for (i=0; i<NREPS; i++)
 	{
@@ -508,19 +508,41 @@
 		b = gnc_numeric_create(nb, deno);
 
 		check_binary_op (gnc_numeric_create(ne,1), 
-                   gnc_numeric_mul(a, b, GNC_DENOM_AUTO, GNC_DENOM_EXACT),
+			          gnc_numeric_mul(a, b, GNC_DENOM_AUTO, GNC_DENOM_EXACT),
 						 a, b, "expected %s got %s = %s * %s for mult exact");
+
+		/* Force 128-bit math to come into play */
 		int j;
 		for (j=1; j<31; j++)
 		{
 			a = gnc_numeric_create(na << j, 1<<j);
 			b = gnc_numeric_create(nb << j, 1<<j);
 			check_binary_op (gnc_numeric_create(ne, 1), 
-                   gnc_numeric_mul(a, b, GNC_DENOM_AUTO, GNC_DENOM_REDUCE),
-						 a, b, "expected %s got %s = %s * %s for mult exact");
+			          gnc_numeric_mul(a, b, GNC_DENOM_AUTO, GNC_DENOM_REDUCE),
+						 a, b, "expected %s got %s = %s * %s for mult reduce");
 		}
-	}
 
+		/* Do some hokey random 128-bit division too */
+		b = gnc_numeric_create(deno, nb);
+
+		check_binary_op (gnc_numeric_create(ne,1), 
+			          gnc_numeric_div(a, b, GNC_DENOM_AUTO, GNC_DENOM_EXACT),
+						 a, b, "expected %s got %s = %s / %s for div exact");
+
+		/* avoid overflow; */
+		na /= 2;
+		nb /= 2;
+		ne = na*nb;
+		for (j=1; j<16; j++)
+		{
+			a = gnc_numeric_create(na << j, 1<<j);
+			b = gnc_numeric_create(1<<j, nb << j);
+			check_binary_op (gnc_numeric_create(ne, 1), 
+			          gnc_numeric_div(a, b, GNC_DENOM_AUTO, GNC_DENOM_REDUCE),
+						 a, b, "expected %s got %s = %s / %s for div reduce");
+		}
+
+	}
 }
   
 /* ======================================================= */


More information about the gnucash-changes mailing list