diff options
Diffstat (limited to 'test_ieee754.c')
-rw-r--r-- | test_ieee754.c | 38 |
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); +} |