diff options
Diffstat (limited to 'winsup/cygwin/math/lroundl.c')
-rw-r--r-- | winsup/cygwin/math/lroundl.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/winsup/cygwin/math/lroundl.c b/winsup/cygwin/math/lroundl.c new file mode 100644 index 0000000..b4584a8 --- /dev/null +++ b/winsup/cygwin/math/lroundl.c @@ -0,0 +1,37 @@ +/** + * 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 +lroundl (long double x) +{ + long double res; + + if (x >= 0.0L) + { + res = ceill (x); + if (res - x > 0.5L) + res -= 1.0; + } + else + { + res = ceill (-x); + if (res + x > 0.5L) + res -= 1.0L; + res = -res; + } + if (!isfinite (res) + || res > (long double)LONG_MAX + || res < (long double)LONG_MIN) + { + errno = ERANGE; + /* Undefined behaviour, so we could return anything. */ + /* return res > 0.0L ? LONG_MAX : LONG_MIN; */ + } + return (long) res; +} |