URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [newlib/] [newlib/] [libm/] [mathfp/] [s_frexp.c] - Rev 1767
Go to most recent revision | Compare with Previous | Blame | View Log
/* @(#)z_frexp.c 1.0 98/08/13 */ /* FUNCTION <<frexp>>, <<frexpf>>---split floating-point number INDEX frexp INDEX frexpf ANSI_SYNOPSIS #include <math.h> double frexp(double <[val]>, int *<[exp]>); float frexpf(float <[val]>, int *<[exp]>); TRAD_SYNOPSIS #include <math.h> double frexp(<[val]>, <[exp]>) double <[val]>; int *<[exp]>; float frexpf(<[val]>, <[exp]>) float <[val]>; int *<[exp]>; DESCRIPTION All non zero, normal numbers can be described as <[m]> * 2**<[p]>. <<frexp>> represents the double <[val]> as a mantissa <[m]> and a power of two <[p]>. The resulting mantissa will always be greater than or equal to <<0.5>>, and less than <<1.0>> (as long as <[val]> is nonzero). The power of two will be stored in <<*>><[exp]>. @ifinfo <[m]> and <[p]> are calculated so that <[val]> is <[m]> times <<2>> to the power <[p]>. @end ifinfo @tex <[m]> and <[p]> are calculated so that $ val = m \times 2^p $. @end tex <<frexpf>> is identical, other than taking and returning floats rather than doubles. RETURNS <<frexp>> returns the mantissa <[m]>. If <[val]> is <<0>>, infinity, or Nan, <<frexp>> will set <<*>><[exp]> to <<0>> and return <[val]>. PORTABILITY <<frexp>> is ANSI. <<frexpf>> is an extension. */ /***************************************************************** * frexp * * Input: * d - floating point value * exp - exponent value * * Output: * A floating point value in the range [0.5, 1). * * Description: * This routine breaks a floating point value into a number f and * an exponent exp such that d = f * 2 ^ exp. * *****************************************************************/ #include "fdlibm.h" #include "zmath.h" #ifndef _DOUBLE_IS_32BITS double frexp (double d, int *exp) { double f; __uint32_t hd, ld, hf, lf; EXTRACT_WORDS (hd, ld, d); /* Get the exponent. */ *exp = ((hd & 0x7ff00000) >> 20) - 1022; /* Get the mantissa. */ lf = ld; hf = hd & 0x800fffff; hf |= 0x3fe00000; INSERT_WORDS (f, hf, lf); /* Check for special values. */ switch (numtest (f)) { case NAN: case INF: errno = EDOM; *exp = 0; return (f); } return (f); } #endif /* _DOUBLE_IS_32BITS */
Go to most recent revision | Compare with Previous | Blame | View Log