aboutsummaryrefslogtreecommitdiffstats
path: root/test_ieee754.c
diff options
context:
space:
mode:
Diffstat (limited to 'test_ieee754.c')
-rw-r--r--test_ieee754.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/test_ieee754.c b/test_ieee754.c
new file mode 100644
index 0000000..44873c9
--- /dev/null
+++ b/test_ieee754.c
@@ -0,0 +1,38 @@
+#include <math.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "ieee754.h"
+
+static unsigned long naiive(float n)
+{
+ union {
+ float f;
+ uint32_t u;
+ } u = { .f = n };
+
+ return u.u;
+}
+
+void test(float a)
+{
+ float b = ieee754f(naiive(a));
+
+ if (!((isnan(a) && isnan(b)) || a == b)) {
+ fprintf(stderr, "%lu: %.40f != %.40f\n", naiive(a), a, b);
+ exit(EXIT_FAILURE);
+ }
+}
+
+int main(void)
+{
+ test(NAN);
+ test(+INFINITY);
+ test(-INFINITY);
+ test(0x1p127f);
+ test(0x7fffffp-149f);
+
+ for (float n = -0.000000001; n <= 1; n = nextafterf(n, 2))
+ test(n);
+}