1*c9945492SAndroid Build Coastguard Worker #include "libm.h" 2*c9945492SAndroid Build Coastguard Worker nexttowardf(float x,long double y)3*c9945492SAndroid Build Coastguard Workerfloat nexttowardf(float x, long double y) 4*c9945492SAndroid Build Coastguard Worker { 5*c9945492SAndroid Build Coastguard Worker union {float f; uint32_t i;} ux = {x}; 6*c9945492SAndroid Build Coastguard Worker uint32_t 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 (x == y) 11*c9945492SAndroid Build Coastguard Worker return y; 12*c9945492SAndroid Build Coastguard Worker if (x == 0) { 13*c9945492SAndroid Build Coastguard Worker ux.i = 1; 14*c9945492SAndroid Build Coastguard Worker if (signbit(y)) 15*c9945492SAndroid Build Coastguard Worker ux.i |= 0x80000000; 16*c9945492SAndroid Build Coastguard Worker } else if (x < y) { 17*c9945492SAndroid Build Coastguard Worker if (signbit(x)) 18*c9945492SAndroid Build Coastguard Worker ux.i--; 19*c9945492SAndroid Build Coastguard Worker else 20*c9945492SAndroid Build Coastguard Worker ux.i++; 21*c9945492SAndroid Build Coastguard Worker } else { 22*c9945492SAndroid Build Coastguard Worker if (signbit(x)) 23*c9945492SAndroid Build Coastguard Worker ux.i++; 24*c9945492SAndroid Build Coastguard Worker else 25*c9945492SAndroid Build Coastguard Worker ux.i--; 26*c9945492SAndroid Build Coastguard Worker } 27*c9945492SAndroid Build Coastguard Worker e = ux.i & 0x7f800000; 28*c9945492SAndroid Build Coastguard Worker /* raise overflow if ux.f is infinite and x is finite */ 29*c9945492SAndroid Build Coastguard Worker if (e == 0x7f800000) 30*c9945492SAndroid Build Coastguard Worker FORCE_EVAL(x+x); 31*c9945492SAndroid Build Coastguard Worker /* raise underflow if ux.f is subnormal or zero */ 32*c9945492SAndroid Build Coastguard Worker if (e == 0) 33*c9945492SAndroid Build Coastguard Worker FORCE_EVAL(x*x + ux.f*ux.f); 34*c9945492SAndroid Build Coastguard Worker return ux.f; 35*c9945492SAndroid Build Coastguard Worker } 36