| /* Test corner case for IEEE expm1 | |
| * | |
| * http://pubs.opengroup.org/onlinepubs/9699919799/functions/expm1.html | |
| */ | |
| #define __USE_MINGW_ANSI_STDIO 1 | |
| #include <math.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| /* mingw-w64 headers */ | |
| #include "libtest.h" | |
| #define STR_VALUE(arg) #arg | |
| #define MINUS_ZERO -0. | |
| #define N_TESTS 5 | |
| int main() | |
| { | |
| int res = 0; | |
| mingw_test_init (); | |
| #define TEST(func, dtype, fmt) do { \ | |
| int i; \ | |
| char fmt_str[20]; \ | |
| dtype input, output, exp; \ | |
| dtype inp_out[N_TESTS][2] = { \ | |
| {0, 0}, \ | |
| {NAN, NAN}, \ | |
| {MINUS_ZERO, MINUS_ZERO}, \ | |
| {-INFINITY, -1}, \ | |
| {INFINITY, INFINITY}, \ | |
| }; \ | |
| sprintf(fmt_str, "%s(%s) = %s\n", STR_VALUE(func), fmt, fmt); \ | |
| for (i = 0; i < N_TESTS; i++) { \ | |
| input = inp_out[i][0]; \ | |
| exp = inp_out[i][1]; \ | |
| output = func(input); \ | |
| printf(fmt_str, input, output); \ | |
| if ((output != exp && !isnan(exp)) || (isnan(output) ^ isnan(exp))) \ | |
| { \ | |
| res |= 1; \ | |
| printf("which is bogus!\n"); \ | |
| } \ | |
| } \ | |
| } while (0) | |
| TEST (expm1, double, "%f"); | |
| TEST (expm1f, float, "%f"); | |
| TEST (expm1l, long double, "%lf"); | |
| return res; | |
| } |