OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc1/] [newlib/] [libm/] [common/] [s_round.c] - Diff between revs 207 and 345

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 345
/*
/*
 * ====================================================
 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 *
 *
 * Developed at SunPro, a Sun Microsystems, Inc. business.
 * Developed at SunPro, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * software is freely granted, provided that this notice
 * is preserved.
 * is preserved.
 * ====================================================
 * ====================================================
 */
 */
/*
/*
FUNCTION
FUNCTION
<<round>>, <<roundf>>--round to integer, to nearest
<<round>>, <<roundf>>--round to integer, to nearest
INDEX
INDEX
        round
        round
INDEX
INDEX
        roundf
        roundf
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <math.h>
        #include <math.h>
        double round(double <[x]>);
        double round(double <[x]>);
        float roundf(float <[x]>);
        float roundf(float <[x]>);
 
 
DESCRIPTION
DESCRIPTION
        The <<round>> functions round their argument to the nearest integer
        The <<round>> functions round their argument to the nearest integer
        value in floating-point format, rounding halfway cases away from zero,
        value in floating-point format, rounding halfway cases away from zero,
        regardless of the current rounding direction.  (While the "inexact"
        regardless of the current rounding direction.  (While the "inexact"
        floating-point exception behavior is unspecified by the C standard, the
        floating-point exception behavior is unspecified by the C standard, the
        <<round>> functions are written so that "inexact" is not raised if the
        <<round>> functions are written so that "inexact" is not raised if the
        result does not equal the argument, which behavior is as recommended by
        result does not equal the argument, which behavior is as recommended by
        IEEE 754 for its related functions.)
        IEEE 754 for its related functions.)
 
 
RETURNS
RETURNS
<[x]> rounded to an integral value.
<[x]> rounded to an integral value.
 
 
PORTABILITY
PORTABILITY
ANSI C, POSIX
ANSI C, POSIX
 
 
SEEALSO
SEEALSO
<<nearbyint>>, <<rint>>
<<nearbyint>>, <<rint>>
 
 
*/
*/
 
 
#include "fdlibm.h"
#include "fdlibm.h"
 
 
#ifndef _DOUBLE_IS_32BITS
#ifndef _DOUBLE_IS_32BITS
 
 
#ifdef __STDC__
#ifdef __STDC__
        double round(double x)
        double round(double x)
#else
#else
        double round(x)
        double round(x)
        double x;
        double x;
#endif
#endif
{
{
  /* Most significant word, least significant word. */
  /* Most significant word, least significant word. */
  __int32_t msw, exponent_less_1023;
  __int32_t msw, exponent_less_1023;
  __uint32_t lsw;
  __uint32_t lsw;
 
 
  EXTRACT_WORDS(msw, lsw, x);
  EXTRACT_WORDS(msw, lsw, x);
 
 
  /* Extract exponent field. */
  /* Extract exponent field. */
  exponent_less_1023 = ((msw & 0x7ff00000) >> 20) - 1023;
  exponent_less_1023 = ((msw & 0x7ff00000) >> 20) - 1023;
 
 
  if (exponent_less_1023 < 20)
  if (exponent_less_1023 < 20)
    {
    {
      if (exponent_less_1023 < 0)
      if (exponent_less_1023 < 0)
        {
        {
          msw &= 0x80000000;
          msw &= 0x80000000;
          if (exponent_less_1023 == -1)
          if (exponent_less_1023 == -1)
            /* Result is +1.0 or -1.0. */
            /* Result is +1.0 or -1.0. */
            msw |= (1023 << 20);
            msw |= (1023 << 20);
          lsw = 0;
          lsw = 0;
        }
        }
      else
      else
        {
        {
          __uint32_t exponent_mask = 0x000fffff >> exponent_less_1023;
          __uint32_t exponent_mask = 0x000fffff >> exponent_less_1023;
          if ((msw & exponent_mask) == 0 && lsw == 0)
          if ((msw & exponent_mask) == 0 && lsw == 0)
            /* x in an integral value. */
            /* x in an integral value. */
            return x;
            return x;
 
 
          msw += 0x00080000 >> exponent_less_1023;
          msw += 0x00080000 >> exponent_less_1023;
          msw &= ~exponent_mask;
          msw &= ~exponent_mask;
          lsw = 0;
          lsw = 0;
        }
        }
    }
    }
  else if (exponent_less_1023 > 51)
  else if (exponent_less_1023 > 51)
    {
    {
      if (exponent_less_1023 == 1024)
      if (exponent_less_1023 == 1024)
        /* x is NaN or infinite. */
        /* x is NaN or infinite. */
        return x + x;
        return x + x;
      else
      else
        return x;
        return x;
    }
    }
  else
  else
    {
    {
      __uint32_t exponent_mask = 0xffffffff >> (exponent_less_1023 - 20);
      __uint32_t exponent_mask = 0xffffffff >> (exponent_less_1023 - 20);
      __uint32_t tmp;
      __uint32_t tmp;
 
 
      if ((lsw & exponent_mask) == 0)
      if ((lsw & exponent_mask) == 0)
        /* x is an integral value. */
        /* x is an integral value. */
        return x;
        return x;
 
 
      tmp = lsw + (1 << (51 - exponent_less_1023));
      tmp = lsw + (1 << (51 - exponent_less_1023));
      if (tmp < lsw)
      if (tmp < lsw)
        msw += 1;
        msw += 1;
      lsw = tmp;
      lsw = tmp;
 
 
      lsw &= ~exponent_mask;
      lsw &= ~exponent_mask;
    }
    }
  INSERT_WORDS(x, msw, lsw);
  INSERT_WORDS(x, msw, lsw);
 
 
  return x;
  return x;
}
}
 
 
#endif /* _DOUBLE_IS_32BITS */
#endif /* _DOUBLE_IS_32BITS */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.