|  | /* | 
|  | * ==================================================== | 
|  | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. | 
|  | * | 
|  | * Developed at SunPro, a Sun Microsystems, Inc. business. | 
|  | * Permission to use, copy, modify, and distribute this | 
|  | * software is freely granted, provided that this notice | 
|  | * is preserved. | 
|  | * ==================================================== | 
|  | */ | 
|  |  | 
|  | #include "bsd_privatef.h" | 
|  |  | 
|  | float bsd__ieee754_remainderf(float x, float p) | 
|  | { | 
|  | int32_t hx,hp; | 
|  | u_int32_t sx; | 
|  | float p_half; | 
|  |  | 
|  | GET_FLOAT_WORD(hx,x); | 
|  | GET_FLOAT_WORD(hp,p); | 
|  | sx = hx&0x80000000; | 
|  | hp &= 0x7fffffff; | 
|  | hx &= 0x7fffffff; | 
|  |  | 
|  | /* purge off exception values */ | 
|  | if(hp==0) return (x*p)/(x*p);         /* p = 0 */ | 
|  | if((hx>=0x7f800000)||                 /* x not finite */ | 
|  | ((hp>0x7f800000)))                  /* p is NaN */ | 
|  | return ((long double)x*p)/((long double)x*p); | 
|  |  | 
|  |  | 
|  | if (hp<=0x7effffff) x = bsd__ieee754_fmodf(x,p+p);    /* now x < 2p */ | 
|  | if ((hx-hp)==0) return zero*x; | 
|  | x  = fabsf(x); | 
|  | p  = fabsf(p); | 
|  | if (hp<0x01000000) { | 
|  | if(x+x>p) { | 
|  | x-=p; | 
|  | if(x+x>=p) x -= p; | 
|  | } | 
|  | } else { | 
|  | p_half = (float)0.5*p; | 
|  | if(x>p_half) { | 
|  | x-=p; | 
|  | if(x>=p_half) x -= p; | 
|  | } | 
|  | } | 
|  | GET_FLOAT_WORD(hx,x); | 
|  | if ((hx&0x7fffffff)==0) hx = 0; | 
|  | SET_FLOAT_WORD(x,hx^sx); | 
|  | return x; | 
|  | } |