12116Sjkh/* e_remainderf.c -- float version of e_remainder.c. 22116Sjkh * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 32116Sjkh */ 42116Sjkh 52116Sjkh/* 62116Sjkh * ==================================================== 72116Sjkh * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 82116Sjkh * 92116Sjkh * Developed at SunPro, a Sun Microsystems, Inc. business. 102116Sjkh * Permission to use, copy, modify, and distribute this 118870Srgrimes * software is freely granted, provided that this notice 122116Sjkh * is preserved. 132116Sjkh * ==================================================== 142116Sjkh */ 152116Sjkh 16176207Sbde#include <sys/cdefs.h> 17176207Sbde__FBSDID("$FreeBSD: releng/11.0/lib/msun/src/e_remainderf.c 176207 2008-02-12 17:11:36Z bde $"); 182116Sjkh 192116Sjkh#include "math.h" 202116Sjkh#include "math_private.h" 212116Sjkh 222116Sjkhstatic const float zero = 0.0; 232116Sjkh 242116Sjkh 2597413Salfredfloat 2697413Salfred__ieee754_remainderf(float x, float p) 272116Sjkh{ 282116Sjkh int32_t hx,hp; 292116Sjkh u_int32_t sx; 302116Sjkh float p_half; 312116Sjkh 322116Sjkh GET_FLOAT_WORD(hx,x); 332116Sjkh GET_FLOAT_WORD(hp,p); 342116Sjkh sx = hx&0x80000000; 352116Sjkh hp &= 0x7fffffff; 362116Sjkh hx &= 0x7fffffff; 372116Sjkh 382116Sjkh /* purge off exception values */ 392116Sjkh if(hp==0) return (x*p)/(x*p); /* p = 0 */ 402116Sjkh if((hx>=0x7f800000)|| /* x not finite */ 412116Sjkh ((hp>0x7f800000))) /* p is NaN */ 42176207Sbde return ((long double)x*p)/((long double)x*p); 432116Sjkh 442116Sjkh 452116Sjkh if (hp<=0x7effffff) x = __ieee754_fmodf(x,p+p); /* now x < 2p */ 462116Sjkh if ((hx-hp)==0) return zero*x; 472116Sjkh x = fabsf(x); 482116Sjkh p = fabsf(p); 492116Sjkh if (hp<0x01000000) { 502116Sjkh if(x+x>p) { 512116Sjkh x-=p; 522116Sjkh if(x+x>=p) x -= p; 532116Sjkh } 542116Sjkh } else { 552116Sjkh p_half = (float)0.5*p; 562116Sjkh if(x>p_half) { 572116Sjkh x-=p; 582116Sjkh if(x>=p_half) x -= p; 592116Sjkh } 602116Sjkh } 612116Sjkh GET_FLOAT_WORD(hx,x); 62176207Sbde if ((hx&0x7fffffff)==0) hx = 0; 632116Sjkh SET_FLOAT_WORD(x,hx^sx); 642116Sjkh return x; 652116Sjkh} 66