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_trunc.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
<<trunc>>, <<truncf>>--round to integer, towards zero
<<trunc>>, <<truncf>>--round to integer, towards zero
INDEX
INDEX
        trunc
        trunc
INDEX
INDEX
        truncf
        truncf
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <math.h>
        #include <math.h>
        double trunc(double <[x]>);
        double trunc(double <[x]>);
        float truncf(float <[x]>);
        float truncf(float <[x]>);
 
 
DESCRIPTION
DESCRIPTION
        The <<trunc>> functions round their argument to the integer value, in
        The <<trunc>> functions round their argument to the integer value, in
        floating format, nearest to but no larger in magnitude than the
        floating format, nearest to but no larger in magnitude than the
        argument, regardless of the current rounding direction.  (While the
        argument, regardless of the current rounding direction.  (While the
        "inexact" floating-point exception behavior is unspecified by the C
        "inexact" floating-point exception behavior is unspecified by the C
        standard, the <<trunc>> functions are written so that "inexact" is not
        standard, the <<trunc>> functions are written so that "inexact" is not
        raised if the result does not equal the argument, which behavior is as
        raised if the result does not equal the argument, which behavior is as
        recommended by IEEE 754 for its related functions.)
        recommended by IEEE 754 for its related functions.)
 
 
RETURNS
RETURNS
<[x]> truncated to an integral value.
<[x]> truncated to an integral value.
 
 
PORTABILITY
PORTABILITY
ANSI C, POSIX
ANSI C, POSIX
 
 
*/
*/
 
 
#include "fdlibm.h"
#include "fdlibm.h"
 
 
#ifndef _DOUBLE_IS_32BITS
#ifndef _DOUBLE_IS_32BITS
 
 
#ifdef __STDC__
#ifdef __STDC__
        double trunc(double x)
        double trunc(double x)
#else
#else
        double trunc(x)
        double trunc(x)
        double x;
        double x;
#endif
#endif
{
{
  int signbit;
  int signbit;
  /* Most significant word, least significant word. */
  /* Most significant word, least significant word. */
  int msw;
  int msw;
  unsigned int lsw;
  unsigned int lsw;
  int exponent_less_1023;
  int exponent_less_1023;
 
 
  EXTRACT_WORDS(msw, lsw, x);
  EXTRACT_WORDS(msw, lsw, x);
 
 
  /* Extract sign bit. */
  /* Extract sign bit. */
  signbit = msw & 0x80000000;
  signbit = msw & 0x80000000;
 
 
  /* 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)
    {
    {
      /* All significant digits are in msw. */
      /* All significant digits are in msw. */
      if (exponent_less_1023 < 0)
      if (exponent_less_1023 < 0)
        {
        {
          /* -1 < x < 1, so result is +0 or -0. */
          /* -1 < x < 1, so result is +0 or -0. */
          INSERT_WORDS(x, signbit, 0);
          INSERT_WORDS(x, signbit, 0);
        }
        }
      else
      else
        {
        {
          /* All relevant fraction bits are in msw, so lsw of the result is 0. */
          /* All relevant fraction bits are in msw, so lsw of the result is 0. */
          INSERT_WORDS(x, signbit | (msw & ~(0x000fffff >> exponent_less_1023)), 0);
          INSERT_WORDS(x, signbit | (msw & ~(0x000fffff >> exponent_less_1023)), 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 infinite, or not a number, so trigger an exception. */
          /* x is infinite, or not a number, so trigger an exception. */
          return x + x;
          return x + x;
        }
        }
      /* All bits in the fraction fields of the msw and lsw are needed in the result. */
      /* All bits in the fraction fields of the msw and lsw are needed in the result. */
    }
    }
  else
  else
    {
    {
      /* All fraction bits in msw are relevant.  Truncate irrelevant
      /* All fraction bits in msw are relevant.  Truncate irrelevant
         bits from lsw. */
         bits from lsw. */
      INSERT_WORDS(x, msw, lsw & ~(0xffffffffu >> (exponent_less_1023 - 20)));
      INSERT_WORDS(x, msw, lsw & ~(0xffffffffu >> (exponent_less_1023 - 20)));
    }
    }
  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.