Back to index

glibc  2.9
Functions | Variables
s_remquof.c File Reference
#include <math.h>
#include "math_private.h"

Go to the source code of this file.

Functions

float __remquof (float x, float y, int *quo)

Variables

static const float zero = 0.0

Function Documentation

float __remquof ( float  x,
float  y,
int quo 
)

Definition at line 30 of file s_remquof.c.

{
  int32_t hx,hy;
  u_int32_t sx;
  int cquo, qs;

  GET_FLOAT_WORD (hx, x);
  GET_FLOAT_WORD (hy, y);
  sx = hx & 0x80000000;
  qs = sx ^ (hy & 0x80000000);
  hy &= 0x7fffffff;
  hx &= 0x7fffffff;

  /* Purge off exception values.  */
  if (hy == 0)
    return (x * y) / (x * y);                    /* y = 0 */
  if ((hx >= 0x7f800000)                  /* x not finite */
      || (hy > 0x7f800000))               /* y is NaN */
    return (x * y) / (x * y);

  if (hy <= 0x7dffffff)
    x = __ieee754_fmodf (x, 8 * y);              /* now x < 8y */

  if ((hx - hy) == 0)
    {
      *quo = qs ? -1 : 1;
      return zero * x;
    }

  x  = fabsf (x);
  y  = fabsf (y);
  cquo = 0;

  if (x >= 4 * y)
    {
      x -= 4 * y;
      cquo += 4;
    }
  if (x >= 2 * y)
    {
      x -= 2 * y;
      cquo += 2;
    }

  if (hy < 0x01000000)
    {
      if (x + x > y)
       {
         x -= y;
         ++cquo;
         if (x + x >= y)
           {
             x -= y;
             ++cquo;
           }
       }
    }
  else
    {
      float y_half = 0.5 * y;
      if (x > y_half)
       {
         x -= y;
         ++cquo;
         if (x >= y_half)
           {
             x -= y;
             ++cquo;
           }
       }
    }

  *quo = qs ? -cquo : cquo;

  if (sx)
    x = -x;
  return x;
}

Here is the call graph for this function:


Variable Documentation

const float zero = 0.0 [static]

Definition at line 26 of file s_remquof.c.