xref: /aosp_15_r20/external/musl/src/math/hypotf.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <math.h>
2*c9945492SAndroid Build Coastguard Worker #include <stdint.h>
3*c9945492SAndroid Build Coastguard Worker 
hypotf(float x,float y)4*c9945492SAndroid Build Coastguard Worker float hypotf(float x, float y)
5*c9945492SAndroid Build Coastguard Worker {
6*c9945492SAndroid Build Coastguard Worker 	union {float f; uint32_t i;} ux = {x}, uy = {y}, ut;
7*c9945492SAndroid Build Coastguard Worker 	float_t z;
8*c9945492SAndroid Build Coastguard Worker 
9*c9945492SAndroid Build Coastguard Worker 	ux.i &= -1U>>1;
10*c9945492SAndroid Build Coastguard Worker 	uy.i &= -1U>>1;
11*c9945492SAndroid Build Coastguard Worker 	if (ux.i < uy.i) {
12*c9945492SAndroid Build Coastguard Worker 		ut = ux;
13*c9945492SAndroid Build Coastguard Worker 		ux = uy;
14*c9945492SAndroid Build Coastguard Worker 		uy = ut;
15*c9945492SAndroid Build Coastguard Worker 	}
16*c9945492SAndroid Build Coastguard Worker 
17*c9945492SAndroid Build Coastguard Worker 	x = ux.f;
18*c9945492SAndroid Build Coastguard Worker 	y = uy.f;
19*c9945492SAndroid Build Coastguard Worker 	if (uy.i == 0xff<<23)
20*c9945492SAndroid Build Coastguard Worker 		return y;
21*c9945492SAndroid Build Coastguard Worker 	if (ux.i >= 0xff<<23 || uy.i == 0 || ux.i - uy.i >= 25<<23)
22*c9945492SAndroid Build Coastguard Worker 		return x + y;
23*c9945492SAndroid Build Coastguard Worker 
24*c9945492SAndroid Build Coastguard Worker 	z = 1;
25*c9945492SAndroid Build Coastguard Worker 	if (ux.i >= (0x7f+60)<<23) {
26*c9945492SAndroid Build Coastguard Worker 		z = 0x1p90f;
27*c9945492SAndroid Build Coastguard Worker 		x *= 0x1p-90f;
28*c9945492SAndroid Build Coastguard Worker 		y *= 0x1p-90f;
29*c9945492SAndroid Build Coastguard Worker 	} else if (uy.i < (0x7f-60)<<23) {
30*c9945492SAndroid Build Coastguard Worker 		z = 0x1p-90f;
31*c9945492SAndroid Build Coastguard Worker 		x *= 0x1p90f;
32*c9945492SAndroid Build Coastguard Worker 		y *= 0x1p90f;
33*c9945492SAndroid Build Coastguard Worker 	}
34*c9945492SAndroid Build Coastguard Worker 	return z*sqrtf((double)x*x + (double)y*y);
35*c9945492SAndroid Build Coastguard Worker }
36