xref: /aosp_15_r20/external/musl/src/math/nextafterf.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "libm.h"
2*c9945492SAndroid Build Coastguard Worker 
nextafterf(float x,float y)3*c9945492SAndroid Build Coastguard Worker float 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