summaryrefslogtreecommitdiff
path: root/docs/probe_math_exception.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2009-02-08 02:04:10 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2009-02-08 02:04:10 +0000
commit7cccb9c2531088502492d92e8632159653de6290 (patch)
tree7e34bb6d1956204501b511c2532fd552cf407df2 /docs/probe_math_exception.c
parent49173d980edd36861fdb00830b8b63d9297327e6 (diff)
nextafterf: trying to correct FP exception handling
Diffstat (limited to 'docs/probe_math_exception.c')
-rw-r--r--docs/probe_math_exception.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/docs/probe_math_exception.c b/docs/probe_math_exception.c
new file mode 100644
index 000000000..dbeccc5cc
--- /dev/null
+++ b/docs/probe_math_exception.c
@@ -0,0 +1,41 @@
+/* Small test program for probing how various math functions
+ * with specific operands set floating point exceptions
+ */
+
+#define _ISOC99_SOURCE 1
+#define _GNU_SOURCE 1
+
+#include <math.h>
+#include <fenv.h>
+#include <stdio.h>
+
+int main(int argc, char **argv)
+{
+ float infF = HUGE_VALF * 2;
+
+ feclearexcept(FE_ALL_EXCEPT);
+
+// printf("%.40e\n", 1.0 / 0.0); // FE_DIVBYZERO
+// printf("%.40e\n", nextafterf(HUGE_VALF, infF)); // no exceptions in glibc 2.4
+
+#define PREX(ex) do { if (fetestexcept(ex)) printf(#ex); } while(0)
+#ifdef FE_INEXACT
+ PREX(FE_INEXACT);
+#endif
+#ifdef FE_DIVBYZERO
+ PREX(FE_DIVBYZERO);
+#endif
+#ifdef FE_UNDERFLOW
+ PREX(FE_UNDERFLOW);
+#endif
+#ifdef FE_OVERFLOW
+ PREX(FE_OVERFLOW);
+#endif
+#ifdef FE_INVALID
+ PREX(FE_INVALID);
+#endif
+ if (fetestexcept(FE_ALL_EXCEPT))
+ printf("\n");
+ printf("done\n");
+ return 0;
+}