POK
|
00001 /* 00002 * POK header 00003 * 00004 * The following file is a part of the POK project. Any modification should 00005 * made according to the POK licence. You CANNOT use this file or a part of 00006 * this file is this part of a file for your own project 00007 * 00008 * For more information on the POK licence, please see our LICENCE FILE 00009 * 00010 * Please follow the coding guidelines described in doc/CODING_GUIDELINES 00011 * 00012 * Copyright (c) 2007-2009 POK team 00013 * 00014 * Created by julien on Fri Jan 30 14:41:34 2009 00015 */ 00016 00017 /* @(#)s_frexp.c 5.1 93/09/24 */ 00018 /* 00019 * ==================================================== 00020 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 00021 * 00022 * Developed at SunPro, a Sun Microsystems, Inc. business. 00023 * Permission to use, copy, modify, and distribute this 00024 * software is freely granted, provided that this notice 00025 * is preserved. 00026 * ==================================================== 00027 */ 00028 00029 /* 00030 * for non-zero x 00031 * x = frexp(arg,&exp); 00032 * return a double fp quantity x such that 0.5 <= |x| <1.0 00033 * and the corresponding binary exponent "exp". That is 00034 * arg = x*2^exp. 00035 * If arg is inf, 0.0, or NaN, then frexp(arg,&exp) returns arg 00036 * with *exp=0. 00037 */ 00038 00039 #ifdef POK_NEEDS_LIBMATH 00040 00041 #include <libm.h> 00042 #include "math_private.h" 00043 00044 static const double 00045 two54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */ 00046 00047 double 00048 frexp(double x, int *eptr) 00049 { 00050 int32_t hx, ix, lx; 00051 EXTRACT_WORDS(hx,lx,x); 00052 ix = 0x7fffffff&hx; 00053 *eptr = 0; 00054 if(ix>=0x7ff00000||((ix|lx)==0)) return x; /* 0,inf,nan */ 00055 if (ix<0x00100000) { /* subnormal */ 00056 x *= two54; 00057 GET_HIGH_WORD(hx,x); 00058 ix = hx&0x7fffffff; 00059 *eptr = -54; 00060 } 00061 *eptr += ((uint32_t)ix>>20)-1022; 00062 hx = (hx&0x800fffff)|0x3fe00000; 00063 SET_HIGH_WORD(x,hx); 00064 return x; 00065 } 00066 00067 #endif