summaryrefslogtreecommitdiff
path: root/test/regression/casts3.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/regression/casts3.c')
-rw-r--r--test/regression/casts3.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/test/regression/casts3.c b/test/regression/casts3.c
new file mode 100644
index 0000000..f6e35c2
--- /dev/null
+++ b/test/regression/casts3.c
@@ -0,0 +1,60 @@
+/* Testing int <-> float conversions */
+
+#include <stdio.h>
+
+unsigned int urand(void)
+{
+ static unsigned int seed = 0;
+ seed = seed * 25173 + 8453;
+ return seed;
+}
+
+signed int srand(void)
+{
+ return (signed int) urand();
+}
+
+double fuzzing[] = { 0.0, 0.01, 0.25, 0.4, 0.5, 0.6, 0.75, 0.99 };
+
+double fuzz(void)
+{
+ static unsigned int n = 0;
+ n = n + 1;
+ if (n >= sizeof(fuzzing) / sizeof(double)) n = 0;
+ return fuzzing[n];
+}
+
+void test_signed_conv(void)
+{
+ int n = srand();
+ double f = fuzz();
+ double d = (double) n;
+ double e = n < 0 ? d - f : d + f;
+ int m = (int) e;
+ if (m != n)
+ printf("\nError: signed: %d, %g, %g, %d\n", n, f, e, m);
+}
+
+void test_unsigned_conv(void)
+{
+ unsigned int n = srand();
+ double f = fuzz();
+ double d = (double) n;
+ double e = f + d;
+ unsigned int m = (unsigned int) e;
+ if (m != n)
+ printf("\nError: unsigned: %u, %g, %g, %u\n", n, f, e, m);
+}
+
+int main()
+{
+ int i;
+ for (i = 0; i < 1000000; i++) {
+ if ((i % 1000) == 0) { printf("."); fflush(stdout); }
+ test_signed_conv();
+ test_unsigned_conv();
+ }
+ printf("\n");
+ return 0;
+}
+