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 /* e_remainderf.c -- float version of e_remainder.c. 00018 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 00019 */ 00020 00021 /* 00022 * ==================================================== 00023 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 00024 * 00025 * Developed at SunPro, a Sun Microsystems, Inc. business. 00026 * Permission to use, copy, modify, and distribute this 00027 * software is freely granted, provided that this notice 00028 * is preserved. 00029 * ==================================================== 00030 */ 00031 00032 #ifdef POK_NEEDS_LIBMATH 00033 00034 #include <libm.h> 00035 #include "math_private.h" 00036 00037 static const float zero = 0.0; 00038 00039 00040 float 00041 __ieee754_remainderf(float x, float p) 00042 { 00043 int32_t hx,hp; 00044 uint32_t sx; 00045 float p_half; 00046 00047 GET_FLOAT_WORD(hx,x); 00048 GET_FLOAT_WORD(hp,p); 00049 sx = hx&0x80000000; 00050 hp &= 0x7fffffff; 00051 hx &= 0x7fffffff; 00052 00053 /* purge off exception values */ 00054 if(hp==0) return (x*p)/(x*p); /* p = 0 */ 00055 if((hx>=0x7f800000)|| /* x not finite */ 00056 ((hp>0x7f800000))) /* p is NaN */ 00057 return (x*p)/(x*p); 00058 00059 00060 if (hp<=0x7effffff) x = __ieee754_fmodf(x,p+p); /* now x < 2p */ 00061 if ((hx-hp)==0) return zero*x; 00062 x = fabsf(x); 00063 p = fabsf(p); 00064 if (hp<0x01000000) { 00065 if(x+x>p) { 00066 x-=p; 00067 if(x+x>=p) x -= p; 00068 } 00069 } else { 00070 p_half = (float)0.5*p; 00071 if(x>p_half) { 00072 x-=p; 00073 if(x>=p_half) x -= p; 00074 } 00075 } 00076 GET_FLOAT_WORD(hx,x); 00077 SET_FLOAT_WORD(x,hx^sx); 00078 return x; 00079 } 00080 #endif