/* Remainder.
- Copyright (C) 2012 Free Software Foundation, Inc.
+ Copyright (C) 2012-2014 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/* Specification. */
#include <math.h>
+#if HAVE_REMAINDER
+
float
remainderf (float x, float y)
{
-#if HAVE_REMAINDER
return (float) remainder ((double) x, (double) y);
+}
+
#else
- float q = - roundf (x / y);
- float r = fmaf (q, y, x); /* = x + q * y, computed in one step */
- /* Correct possible rounding errors in the quotient x / y. */
- float half_y = 0.5L * y;
- if (y >= 0)
- {
- /* Expect -y/2 <= r <= y/2. */
- if (r > half_y)
- q -= 1, r = fmaf (q, y, x);
- else if (r < - half_y)
- q += 1, r = fmaf (q, y, x);
- }
- else
- {
- /* Expect y/2 <= r <= -y/2. */
- if (r > - half_y)
- q += 1, r = fmaf (q, y, x);
- else if (r < half_y)
- q -= 1, r = fmaf (q, y, x);
- }
- return r;
+
+# define USE_FLOAT
+# include "remainder.c"
+
#endif
-}