diff options
Diffstat (limited to 'winsup/cygwin/math/llroundl.c')
-rw-r--r-- | winsup/cygwin/math/llroundl.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/winsup/cygwin/math/llroundl.c b/winsup/cygwin/math/llroundl.c new file mode 100644 index 000000000..fc600e77d --- /dev/null +++ b/winsup/cygwin/math/llroundl.c @@ -0,0 +1,38 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#include <math.h> +#include <limits.h> +#include <errno.h> + +long long +llroundl (long double x) +{ + long double res; + + if (x >= 0.0L) + { + res = ceill (x); + if (res - x > 0.5L) + res -= 1.0L; + } + else + { + res = ceill (-x); + if (res + x > 0.5L) + res -= 1.0L; + res = -res; + } + if (!isfinite (res) + || res > (double) LLONG_MAX + || res < (double) LLONG_MIN) + { + errno = ERANGE; + /* Undefined behaviour, so we could return anything. */ + /* return res > 0.0 ? LLONG_MAX : LLONG_MIN; */ + } + return (long long) res; +} + |