diff options
Diffstat (limited to 'src/math/pow.c')
-rw-r--r-- | src/math/pow.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/math/pow.c b/src/math/pow.c new file mode 100644 index 00000000..4fb3aa2a --- /dev/null +++ b/src/math/pow.c @@ -0,0 +1,39 @@ +# define TGSOURCE "pow.c" +#include <math.h> +#include "nonstd/tgmath.h" +#include "errno.h" + +/** exponentiation **/ +TYPE TGFN(pow)(TYPE x, TYPE y) +{ + if (x < 0 /* && !isintegral(y) */) { + errno = EDOM; /* ARGUMENT(x) is negative and ARGUMENT(y) is not an integer */ + return TGHUGE; + } + + if (x == 0 && y <= 0) { + errno = EDOM; /* ARGUMENT(x) is LITERAL(0) and ARGUMENT(y) is less than or equal to LITERAL(0) */ + return TGHUGE; + } + + if (0) { + errno = ERANGE; /* The result cannot be represented */ + /* RETURN_FAILURE(CONSTANT(HUGE_VAL), A range error occurred); */ + return TGHUGE; + } + + /* RETURN_SUCCESS(POW(ARGUMENT(x), ARGUMENT(y))); */ + return x * y; +} + +/*** +compute ARGUMENT(x) raised to the power ARGUMENT(y). +***/ + +/* +IMPLEMENTATION(The value returned on a domain error, CONSTANT(HUGE_VAL)) +LINK(m) +*/ +/* +STDC(1) +*/ |