1*c9945492SAndroid Build Coastguard Worker #include "libm.h" 2*c9945492SAndroid Build Coastguard Worker nextafterf(float x,float y)3*c9945492SAndroid Build Coastguard Workerfloat nextafterf(float x, float y) 4*c9945492SAndroid Build Coastguard Worker { 5*c9945492SAndroid Build Coastguard Worker union {float f; uint32_t i;} ux={x}, uy={y}; 6*c9945492SAndroid Build Coastguard Worker uint32_t ax, ay, e; 7*c9945492SAndroid Build Coastguard Worker 8*c9945492SAndroid Build Coastguard Worker if (isnan(x) || isnan(y)) 9*c9945492SAndroid Build Coastguard Worker return x + y; 10*c9945492SAndroid Build Coastguard Worker if (ux.i == uy.i) 11*c9945492SAndroid Build Coastguard Worker return y; 12*c9945492SAndroid Build Coastguard Worker ax = ux.i & 0x7fffffff; 13*c9945492SAndroid Build Coastguard Worker ay = uy.i & 0x7fffffff; 14*c9945492SAndroid Build Coastguard Worker if (ax == 0) { 15*c9945492SAndroid Build Coastguard Worker if (ay == 0) 16*c9945492SAndroid Build Coastguard Worker return y; 17*c9945492SAndroid Build Coastguard Worker ux.i = (uy.i & 0x80000000) | 1; 18*c9945492SAndroid Build Coastguard Worker } else if (ax > ay || ((ux.i ^ uy.i) & 0x80000000)) 19*c9945492SAndroid Build Coastguard Worker ux.i--; 20*c9945492SAndroid Build Coastguard Worker else 21*c9945492SAndroid Build Coastguard Worker ux.i++; 22*c9945492SAndroid Build Coastguard Worker e = ux.i & 0x7f800000; 23*c9945492SAndroid Build Coastguard Worker /* raise overflow if ux.f is infinite and x is finite */ 24*c9945492SAndroid Build Coastguard Worker if (e == 0x7f800000) 25*c9945492SAndroid Build Coastguard Worker FORCE_EVAL(x+x); 26*c9945492SAndroid Build Coastguard Worker /* raise underflow if ux.f is subnormal or zero */ 27*c9945492SAndroid Build Coastguard Worker if (e == 0) 28*c9945492SAndroid Build Coastguard Worker FORCE_EVAL(x*x + ux.f*ux.f); 29*c9945492SAndroid Build Coastguard Worker return ux.f; 30*c9945492SAndroid Build Coastguard Worker } 31