1use super::fabsf;
17
18const ATAN_HI: [f32; 4] = [
19 4.6364760399e-01, 7.8539812565e-01, 9.8279368877e-01, 1.5707962513e+00, ];
24
25const ATAN_LO: [f32; 4] = [
26 5.0121582440e-09, 3.7748947079e-08, 3.4473217170e-08, 7.5497894159e-08, ];
31
32const A_T: [f32; 5] = [
33 3.3333328366e-01,
34 -1.9999158382e-01,
35 1.4253635705e-01,
36 -1.0648017377e-01,
37 6.1687607318e-02,
38];
39
40#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
45pub fn atanf(mut x: f32) -> f32 {
46 let x1p_120 = f32::from_bits(0x03800000); let z: f32;
49
50 let mut ix = x.to_bits();
51 let sign = (ix >> 31) != 0;
52 ix &= 0x7fffffff;
53
54 if ix >= 0x4c800000 {
55 if x.is_nan() {
57 return x;
58 }
59 z = *ATAN_HI.get(3).unwrap()i!(ATAN_HI, 3) + x1p_120;
60 return if sign { -z } else { z };
61 }
62 let id = if ix < 0x3ee00000 {
63 if ix < 0x39800000 {
65 if ix < 0x00800000 {
67 unsafe { ::core::ptr::read_volatile(&(x * x)) };force_eval!(x * x);
69 }
70 return x;
71 }
72 -1
73 } else {
74 x = fabsf(x);
75 if ix < 0x3f980000 {
76 if ix < 0x3f300000 {
78 x = (2. * x - 1.) / (2. + x);
80 0
81 } else {
82 x = (x - 1.) / (x + 1.);
84 1
85 }
86 } else if ix < 0x401c0000 {
87 x = (x - 1.5) / (1. + 1.5 * x);
89 2
90 } else {
91 x = -1. / x;
93 3
94 }
95 };
96 z = x * x;
98 let w = z * z;
99 let s1 = z * (*A_T.get(0).unwrap()i!(A_T, 0) + w * (*A_T.get(2).unwrap()i!(A_T, 2) + w * *A_T.get(4).unwrap()i!(A_T, 4)));
101 let s2 = w * (*A_T.get(1).unwrap()i!(A_T, 1) + w * *A_T.get(3).unwrap()i!(A_T, 3));
102 if id < 0 {
103 return x - x * (s1 + s2);
104 }
105 let id = id as usize;
106 let z = *ATAN_HI.get(id).unwrap()i!(ATAN_HI, id) - ((x * (s1 + s2) - *ATAN_LO.get(id).unwrap()i!(ATAN_LO, id)) - x);
107 if sign { -z } else { z }
108}