diff options
Diffstat (limited to 'sysdeps/ieee754/dbl-64')
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_fmod.c | 22 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/math_config.h | 3 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/math_err.c | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/w_fmod.c | 1 |
4 files changed, 28 insertions, 4 deletions
diff --git a/sysdeps/ieee754/dbl-64/e_fmod.c b/sysdeps/ieee754/dbl-64/e_fmod.c index e661ca1..caae4e4 100644 --- a/sysdeps/ieee754/dbl-64/e_fmod.c +++ b/sysdeps/ieee754/dbl-64/e_fmod.c @@ -16,7 +16,9 @@ License along with the GNU C Library; if not, see <https://www.gnu.org/licenses/>. */ +#include <libm-alias-double.h> #include <libm-alias-finite.h> +#include <math-svid-compat.h> #include <math.h> #include "math_config.h" @@ -55,7 +57,7 @@ } */ double -__ieee754_fmod (double x, double y) +__fmod (double x, double y) { uint64_t hx = asuint64 (x); uint64_t hy = asuint64 (y); @@ -67,11 +69,16 @@ __ieee754_fmod (double x, double y) /* Special cases: - If x or y is a Nan, NaN is returned. - - If x is an inifinity, a NaN is returned. + - If x is an inifinity, a NaN is returned and EDOM is set. - If y is zero, Nan is returned. - If x is +0/-0, and y is not zero, +0/-0 is returned. */ - if (__glibc_unlikely (hy == 0 || hx >= EXPONENT_MASK || hy > EXPONENT_MASK)) - return (x * y) / (x * y); + if (__glibc_unlikely (hy == 0 + || hx >= EXPONENT_MASK || hy > EXPONENT_MASK)) + { + if (is_nan (hx) || is_nan (hy)) + return (x * y) / (x * y); + return __math_edom ((x * y) / (x * y)); + } if (__glibc_unlikely (hx <= hy)) { @@ -153,4 +160,11 @@ __ieee754_fmod (double x, double y) return make_double (mx, ey, sx); } +strong_alias (__fmod, __ieee754_fmod) libm_alias_finite (__ieee754_fmod, __fmod) +#if LIBM_SVID_COMPAT +versioned_symbol (libm, __fmod, fmod, GLIBC_2_38); +libm_alias_double_other (__fmod, fmod) +#else +libm_alias_double (__fmod, fmod) +#endif diff --git a/sysdeps/ieee754/dbl-64/math_config.h b/sysdeps/ieee754/dbl-64/math_config.h index 2049cea..499ca75 100644 --- a/sysdeps/ieee754/dbl-64/math_config.h +++ b/sysdeps/ieee754/dbl-64/math_config.h @@ -170,6 +170,9 @@ attribute_hidden double __math_invalid (double); /* Error handling using output checking, only for errno setting. */ +/* Check if the result generated a demain error. */ +attribute_hidden double __math_edom (double x); + /* Check if the result overflowed to infinity. */ attribute_hidden double __math_check_oflow (double); /* Check if the result underflowed to 0. */ diff --git a/sysdeps/ieee754/dbl-64/math_err.c b/sysdeps/ieee754/dbl-64/math_err.c index 5f5f965..377a4ca 100644 --- a/sysdeps/ieee754/dbl-64/math_err.c +++ b/sysdeps/ieee754/dbl-64/math_err.c @@ -33,6 +33,12 @@ with_errno (double y, int e) #define with_errno(x, e) (x) #endif +attribute_hidden double +__math_edom (double y) +{ + return with_errno (y, EDOM); +} + /* NOINLINE reduces code size. */ NOINLINE static double xflow (uint32_t sign, double y) diff --git a/sysdeps/ieee754/dbl-64/w_fmod.c b/sysdeps/ieee754/dbl-64/w_fmod.c new file mode 100644 index 0000000..1cc8931 --- /dev/null +++ b/sysdeps/ieee754/dbl-64/w_fmod.c @@ -0,0 +1 @@ +/* Not needed. */ |