Skip to main content

core_math_rs/f16/
atanh.rs

1/* Correctly-rounded hyperbolic arc-tangent for binary16 value.
2
3Copyright (c) 2025 Paul Zimmermann
4
5This file is ported from the CORE-MATH project
6(https://core-math.gitlabpages.inria.fr/).
7
8Permission is hereby granted, free of charge, to any person obtaining a copy
9of this software and associated documentation files (the "Software"), to deal
10in the Software without restriction, including without limitation the rights
11to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12copies of the Software, and to permit persons to whom the Software is
13furnished to do so, subject to the following conditions:
14
15The above copyright notice and this permission notice shall be included in all
16copies or substantial portions of the Software.
17
18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24SOFTWARE.
25*/
26
27use hexf::hexf32 as h;
28
29use super::utils::snanf16;
30
31/* For 0 <= i < 2^10, T1[i] contains a binary32 approximation to nearest
32of atanh(1/2+i/2^11). Table generated by table1() from atanh.sage. */
33const T1: [f32; 1024] = [
34    h!("0x1.193ea8p-1"),
35    h!("0x1.199404p-1"),
36    h!("0x1.19e96ep-1"),
37    h!("0x1.1a3ee8p-1"),
38    h!("0x1.1a947p-1"),
39    h!("0x1.1aea04p-1"),
40    h!("0x1.1b3fa8p-1"),
41    h!("0x1.1b955cp-1"),
42    h!("0x1.1beb1cp-1"),
43    h!("0x1.1c40ecp-1"),
44    h!("0x1.1c96cap-1"),
45    h!("0x1.1cecb6p-1"),
46    h!("0x1.1d42b2p-1"),
47    h!("0x1.1d98bap-1"),
48    h!("0x1.1deed4p-1"),
49    h!("0x1.1e44fap-1"),
50    h!("0x1.1e9b3p-1"),
51    h!("0x1.1ef174p-1"),
52    h!("0x1.1f47c8p-1"),
53    h!("0x1.1f9e2ap-1"),
54    h!("0x1.1ff49ap-1"),
55    h!("0x1.204b1ap-1"),
56    h!("0x1.20a1aap-1"),
57    h!("0x1.20f846p-1"),
58    h!("0x1.214ef4p-1"),
59    h!("0x1.21a5bp-1"),
60    h!("0x1.21fc7ap-1"),
61    h!("0x1.225354p-1"),
62    h!("0x1.22aa3ep-1"),
63    h!("0x1.230136p-1"),
64    h!("0x1.23583cp-1"),
65    h!("0x1.23af54p-1"),
66    h!("0x1.24067ap-1"),
67    h!("0x1.245daep-1"),
68    h!("0x1.24b4f2p-1"),
69    h!("0x1.250c46p-1"),
70    h!("0x1.2563aap-1"),
71    h!("0x1.25bb1cp-1"),
72    h!("0x1.2612ap-1"),
73    h!("0x1.266a32p-1"),
74    h!("0x1.26c1d2p-1"),
75    h!("0x1.271984p-1"),
76    h!("0x1.277144p-1"),
77    h!("0x1.27c914p-1"),
78    h!("0x1.2820f4p-1"),
79    h!("0x1.2878e4p-1"),
80    h!("0x1.28d0e4p-1"),
81    h!("0x1.2928f2p-1"),
82    h!("0x1.298112p-1"),
83    h!("0x1.29d94p-1"),
84    h!("0x1.2a318p-1"),
85    h!("0x1.2a89cep-1"),
86    h!("0x1.2ae22ep-1"),
87    h!("0x1.2b3a9cp-1"),
88    h!("0x1.2b931cp-1"),
89    h!("0x1.2bebaap-1"),
90    h!("0x1.2c444ap-1"),
91    h!("0x1.2c9cfap-1"),
92    h!("0x1.2cf5bap-1"),
93    h!("0x1.2d4e8ap-1"),
94    h!("0x1.2da76ap-1"),
95    h!("0x1.2e005ap-1"),
96    h!("0x1.2e595cp-1"),
97    h!("0x1.2eb26cp-1"),
98    h!("0x1.2f0b8ep-1"),
99    h!("0x1.2f64c2p-1"),
100    h!("0x1.2fbe04p-1"),
101    h!("0x1.301758p-1"),
102    h!("0x1.3070bcp-1"),
103    h!("0x1.30ca3p-1"),
104    h!("0x1.3123b6p-1"),
105    h!("0x1.317d4cp-1"),
106    h!("0x1.31d6f4p-1"),
107    h!("0x1.3230aap-1"),
108    h!("0x1.328a74p-1"),
109    h!("0x1.32e44ep-1"),
110    h!("0x1.333e38p-1"),
111    h!("0x1.339834p-1"),
112    h!("0x1.33f24p-1"),
113    h!("0x1.344c5ep-1"),
114    h!("0x1.34a68cp-1"),
115    h!("0x1.3500ccp-1"),
116    h!("0x1.355b1cp-1"),
117    h!("0x1.35b57ep-1"),
118    h!("0x1.360ff2p-1"),
119    h!("0x1.366a76p-1"),
120    h!("0x1.36c50cp-1"),
121    h!("0x1.371fb4p-1"),
122    h!("0x1.377a6ep-1"),
123    h!("0x1.37d538p-1"),
124    h!("0x1.383014p-1"),
125    h!("0x1.388bp-1"),
126    h!("0x1.38e6p-1"),
127    h!("0x1.39411p-1"),
128    h!("0x1.399c32p-1"),
129    h!("0x1.39f766p-1"),
130    h!("0x1.3a52acp-1"),
131    h!("0x1.3aae04p-1"),
132    h!("0x1.3b096ep-1"),
133    h!("0x1.3b64eap-1"),
134    h!("0x1.3bc076p-1"),
135    h!("0x1.3c1c16p-1"),
136    h!("0x1.3c77c8p-1"),
137    h!("0x1.3cd38ap-1"),
138    h!("0x1.3d2f6p-1"),
139    h!("0x1.3d8b48p-1"),
140    h!("0x1.3de742p-1"),
141    h!("0x1.3e434ep-1"),
142    h!("0x1.3e9f6cp-1"),
143    h!("0x1.3efb9ep-1"),
144    h!("0x1.3f57ep-1"),
145    h!("0x1.3fb436p-1"),
146    h!("0x1.40109ep-1"),
147    h!("0x1.406d18p-1"),
148    h!("0x1.40c9a6p-1"),
149    h!("0x1.412646p-1"),
150    h!("0x1.4182f8p-1"),
151    h!("0x1.41dfbcp-1"),
152    h!("0x1.423c94p-1"),
153    h!("0x1.42998p-1"),
154    h!("0x1.42f67cp-1"),
155    h!("0x1.43538ep-1"),
156    h!("0x1.43b0bp-1"),
157    h!("0x1.440de6p-1"),
158    h!("0x1.446b3p-1"),
159    h!("0x1.44c88cp-1"),
160    h!("0x1.4525fcp-1"),
161    h!("0x1.45837ep-1"),
162    h!("0x1.45e114p-1"),
163    h!("0x1.463ebep-1"),
164    h!("0x1.469c7ap-1"),
165    h!("0x1.46fa4ap-1"),
166    h!("0x1.47582cp-1"),
167    h!("0x1.47b624p-1"),
168    h!("0x1.48142ep-1"),
169    h!("0x1.48724ap-1"),
170    h!("0x1.48d07cp-1"),
171    h!("0x1.492ec2p-1"),
172    h!("0x1.498d1ap-1"),
173    h!("0x1.49eb86p-1"),
174    h!("0x1.4a4a06p-1"),
175    h!("0x1.4aa89ap-1"),
176    h!("0x1.4b0742p-1"),
177    h!("0x1.4b65fep-1"),
178    h!("0x1.4bc4cep-1"),
179    h!("0x1.4c23b2p-1"),
180    h!("0x1.4c82aap-1"),
181    h!("0x1.4ce1b6p-1"),
182    h!("0x1.4d40d6p-1"),
183    h!("0x1.4da00ap-1"),
184    h!("0x1.4dff52p-1"),
185    h!("0x1.4e5ebp-1"),
186    h!("0x1.4ebe22p-1"),
187    h!("0x1.4f1da8p-1"),
188    h!("0x1.4f7d42p-1"),
189    h!("0x1.4fdcf2p-1"),
190    h!("0x1.503cb4p-1"),
191    h!("0x1.509c8ep-1"),
192    h!("0x1.50fc7ap-1"),
193    h!("0x1.515c7cp-1"),
194    h!("0x1.51bc92p-1"),
195    h!("0x1.521cbep-1"),
196    h!("0x1.527cfep-1"),
197    h!("0x1.52dd54p-1"),
198    h!("0x1.533dbep-1"),
199    h!("0x1.539e3ep-1"),
200    h!("0x1.53fed2p-1"),
201    h!("0x1.545f7cp-1"),
202    h!("0x1.54c03cp-1"),
203    h!("0x1.55211p-1"),
204    h!("0x1.5581fap-1"),
205    h!("0x1.55e2f8p-1"),
206    h!("0x1.56440ep-1"),
207    h!("0x1.56a538p-1"),
208    h!("0x1.570678p-1"),
209    h!("0x1.5767ccp-1"),
210    h!("0x1.57c938p-1"),
211    h!("0x1.582ab8p-1"),
212    h!("0x1.588c4ep-1"),
213    h!("0x1.58edfap-1"),
214    h!("0x1.594fbep-1"),
215    h!("0x1.59b196p-1"),
216    h!("0x1.5a1384p-1"),
217    h!("0x1.5a7588p-1"),
218    h!("0x1.5ad7a2p-1"),
219    h!("0x1.5b39d4p-1"),
220    h!("0x1.5b9c1ap-1"),
221    h!("0x1.5bfe78p-1"),
222    h!("0x1.5c60ecp-1"),
223    h!("0x1.5cc376p-1"),
224    h!("0x1.5d2616p-1"),
225    h!("0x1.5d88ccp-1"),
226    h!("0x1.5deb9ap-1"),
227    h!("0x1.5e4e7ep-1"),
228    h!("0x1.5eb17ap-1"),
229    h!("0x1.5f148cp-1"),
230    h!("0x1.5f77b4p-1"),
231    h!("0x1.5fdaf4p-1"),
232    h!("0x1.603e4ap-1"),
233    h!("0x1.60a1b8p-1"),
234    h!("0x1.61053cp-1"),
235    h!("0x1.6168d8p-1"),
236    h!("0x1.61cc8cp-1"),
237    h!("0x1.623056p-1"),
238    h!("0x1.629438p-1"),
239    h!("0x1.62f83p-1"),
240    h!("0x1.635c4p-1"),
241    h!("0x1.63c068p-1"),
242    h!("0x1.6424a8p-1"),
243    h!("0x1.6489p-1"),
244    h!("0x1.64ed6ep-1"),
245    h!("0x1.6551f4p-1"),
246    h!("0x1.65b694p-1"),
247    h!("0x1.661b4ap-1"),
248    h!("0x1.668018p-1"),
249    h!("0x1.66e4fep-1"),
250    h!("0x1.6749fcp-1"),
251    h!("0x1.67af14p-1"),
252    h!("0x1.681442p-1"),
253    h!("0x1.687988p-1"),
254    h!("0x1.68dee8p-1"),
255    h!("0x1.69446p-1"),
256    h!("0x1.69a9fp-1"),
257    h!("0x1.6a0f98p-1"),
258    h!("0x1.6a755ap-1"),
259    h!("0x1.6adb34p-1"),
260    h!("0x1.6b4128p-1"),
261    h!("0x1.6ba732p-1"),
262    h!("0x1.6c0d58p-1"),
263    h!("0x1.6c7394p-1"),
264    h!("0x1.6cd9eap-1"),
265    h!("0x1.6d405ap-1"),
266    h!("0x1.6da6e4p-1"),
267    h!("0x1.6e0d84p-1"),
268    h!("0x1.6e744p-1"),
269    h!("0x1.6edb14p-1"),
270    h!("0x1.6f4202p-1"),
271    h!("0x1.6fa90ap-1"),
272    h!("0x1.70102ap-1"),
273    h!("0x1.707766p-1"),
274    h!("0x1.70debap-1"),
275    h!("0x1.714628p-1"),
276    h!("0x1.71adbp-1"),
277    h!("0x1.72155p-1"),
278    h!("0x1.727d0cp-1"),
279    h!("0x1.72e4e2p-1"),
280    h!("0x1.734cd2p-1"),
281    h!("0x1.73b4dcp-1"),
282    h!("0x1.741dp-1"),
283    h!("0x1.74854p-1"),
284    h!("0x1.74ed98p-1"),
285    h!("0x1.75560cp-1"),
286    h!("0x1.75be9ap-1"),
287    h!("0x1.762742p-1"),
288    h!("0x1.769006p-1"),
289    h!("0x1.76f8e4p-1"),
290    h!("0x1.7761dep-1"),
291    h!("0x1.77caf2p-1"),
292    h!("0x1.78342p-1"),
293    h!("0x1.789d6ap-1"),
294    h!("0x1.7906dp-1"),
295    h!("0x1.79705p-1"),
296    h!("0x1.79d9ecp-1"),
297    h!("0x1.7a43a4p-1"),
298    h!("0x1.7aad76p-1"),
299    h!("0x1.7b1764p-1"),
300    h!("0x1.7b816ep-1"),
301    h!("0x1.7beb94p-1"),
302    h!("0x1.7c55d6p-1"),
303    h!("0x1.7cc032p-1"),
304    h!("0x1.7d2aacp-1"),
305    h!("0x1.7d954p-1"),
306    h!("0x1.7dfff2p-1"),
307    h!("0x1.7e6acp-1"),
308    h!("0x1.7ed5a8p-1"),
309    h!("0x1.7f40aep-1"),
310    h!("0x1.7fabdp-1"),
311    h!("0x1.80171p-1"),
312    h!("0x1.80826cp-1"),
313    h!("0x1.80ede4p-1"),
314    h!("0x1.815978p-1"),
315    h!("0x1.81c52ap-1"),
316    h!("0x1.8230f8p-1"),
317    h!("0x1.829ce4p-1"),
318    h!("0x1.8308ecp-1"),
319    h!("0x1.837512p-1"),
320    h!("0x1.83e154p-1"),
321    h!("0x1.844db4p-1"),
322    h!("0x1.84ba32p-1"),
323    h!("0x1.8526cep-1"),
324    h!("0x1.859386p-1"),
325    h!("0x1.86005cp-1"),
326    h!("0x1.866d5p-1"),
327    h!("0x1.86da62p-1"),
328    h!("0x1.874792p-1"),
329    h!("0x1.87b4ep-1"),
330    h!("0x1.88224cp-1"),
331    h!("0x1.888fd6p-1"),
332    h!("0x1.88fd7ep-1"),
333    h!("0x1.896b46p-1"),
334    h!("0x1.89d92ap-1"),
335    h!("0x1.8a472ep-1"),
336    h!("0x1.8ab55p-1"),
337    h!("0x1.8b2392p-1"),
338    h!("0x1.8b91f2p-1"),
339    h!("0x1.8c007p-1"),
340    h!("0x1.8c6f0ep-1"),
341    h!("0x1.8cddcap-1"),
342    h!("0x1.8d4ca6p-1"),
343    h!("0x1.8dbba2p-1"),
344    h!("0x1.8e2abcp-1"),
345    h!("0x1.8e99f6p-1"),
346    h!("0x1.8f095p-1"),
347    h!("0x1.8f78c8p-1"),
348    h!("0x1.8fe862p-1"),
349    h!("0x1.90581ap-1"),
350    h!("0x1.90c7f2p-1"),
351    h!("0x1.9137ecp-1"),
352    h!("0x1.91a804p-1"),
353    h!("0x1.92183cp-1"),
354    h!("0x1.928896p-1"),
355    h!("0x1.92f91p-1"),
356    h!("0x1.9369aap-1"),
357    h!("0x1.93da64p-1"),
358    h!("0x1.944b4p-1"),
359    h!("0x1.94bc3cp-1"),
360    h!("0x1.952d58p-1"),
361    h!("0x1.959e96p-1"),
362    h!("0x1.960ff6p-1"),
363    h!("0x1.968176p-1"),
364    h!("0x1.96f318p-1"),
365    h!("0x1.9764dap-1"),
366    h!("0x1.97d6cp-1"),
367    h!("0x1.9848c6p-1"),
368    h!("0x1.98baeep-1"),
369    h!("0x1.992d36p-1"),
370    h!("0x1.999fa2p-1"),
371    h!("0x1.9a123p-1"),
372    h!("0x1.9a84dep-1"),
373    h!("0x1.9af7bp-1"),
374    h!("0x1.9b6aa4p-1"),
375    h!("0x1.9bddbcp-1"),
376    h!("0x1.9c50f4p-1"),
377    h!("0x1.9cc45p-1"),
378    h!("0x1.9d37cep-1"),
379    h!("0x1.9dab7p-1"),
380    h!("0x1.9e1f34p-1"),
381    h!("0x1.9e931ap-1"),
382    h!("0x1.9f0724p-1"),
383    h!("0x1.9f7b52p-1"),
384    h!("0x1.9fefa4p-1"),
385    h!("0x1.a06418p-1"),
386    h!("0x1.a0d8bp-1"),
387    h!("0x1.a14d6cp-1"),
388    h!("0x1.a1c24cp-1"),
389    h!("0x1.a2375p-1"),
390    h!("0x1.a2ac78p-1"),
391    h!("0x1.a321c2p-1"),
392    h!("0x1.a39734p-1"),
393    h!("0x1.a40cc8p-1"),
394    h!("0x1.a4828p-1"),
395    h!("0x1.a4f85ep-1"),
396    h!("0x1.a56e6p-1"),
397    h!("0x1.a5e488p-1"),
398    h!("0x1.a65ad4p-1"),
399    h!("0x1.a6d146p-1"),
400    h!("0x1.a747dcp-1"),
401    h!("0x1.a7be98p-1"),
402    h!("0x1.a8357ap-1"),
403    h!("0x1.a8ac8p-1"),
404    h!("0x1.a923aep-1"),
405    h!("0x1.a99bp-1"),
406    h!("0x1.aa1278p-1"),
407    h!("0x1.aa8a16p-1"),
408    h!("0x1.ab01dap-1"),
409    h!("0x1.ab79c6p-1"),
410    h!("0x1.abf1d8p-1"),
411    h!("0x1.ac6a0ep-1"),
412    h!("0x1.ace26ep-1"),
413    h!("0x1.ad5af2p-1"),
414    h!("0x1.add39ep-1"),
415    h!("0x1.ae4c72p-1"),
416    h!("0x1.aec56cp-1"),
417    h!("0x1.af3e8ep-1"),
418    h!("0x1.afb7d8p-1"),
419    h!("0x1.b03148p-1"),
420    h!("0x1.b0aaep-1"),
421    h!("0x1.b124ap-1"),
422    h!("0x1.b19e8ap-1"),
423    h!("0x1.b2189ap-1"),
424    h!("0x1.b292d2p-1"),
425    h!("0x1.b30d32p-1"),
426    h!("0x1.b387bcp-1"),
427    h!("0x1.b4026ep-1"),
428    h!("0x1.b47d48p-1"),
429    h!("0x1.b4f84cp-1"),
430    h!("0x1.b57378p-1"),
431    h!("0x1.b5eecep-1"),
432    h!("0x1.b66a4cp-1"),
433    h!("0x1.b6e5f6p-1"),
434    h!("0x1.b761c6p-1"),
435    h!("0x1.b7ddc2p-1"),
436    h!("0x1.b859e8p-1"),
437    h!("0x1.b8d638p-1"),
438    h!("0x1.b952bp-1"),
439    h!("0x1.b9cf54p-1"),
440    h!("0x1.ba4c22p-1"),
441    h!("0x1.bac91cp-1"),
442    h!("0x1.bb463ep-1"),
443    h!("0x1.bbc38ep-1"),
444    h!("0x1.bc4106p-1"),
445    h!("0x1.bcbeaap-1"),
446    h!("0x1.bd3c7ap-1"),
447    h!("0x1.bdba76p-1"),
448    h!("0x1.be389cp-1"),
449    h!("0x1.beb6eep-1"),
450    h!("0x1.bf356cp-1"),
451    h!("0x1.bfb416p-1"),
452    h!("0x1.c032ecp-1"),
453    h!("0x1.c0b1eep-1"),
454    h!("0x1.c1311ep-1"),
455    h!("0x1.c1b07ap-1"),
456    h!("0x1.c23002p-1"),
457    h!("0x1.c2afb8p-1"),
458    h!("0x1.c32f9ap-1"),
459    h!("0x1.c3afaap-1"),
460    h!("0x1.c42fe6p-1"),
461    h!("0x1.c4b052p-1"),
462    h!("0x1.c530eap-1"),
463    h!("0x1.c5b1bp-1"),
464    h!("0x1.c632a4p-1"),
465    h!("0x1.c6b3c6p-1"),
466    h!("0x1.c73516p-1"),
467    h!("0x1.c7b696p-1"),
468    h!("0x1.c83844p-1"),
469    h!("0x1.c8ba2p-1"),
470    h!("0x1.c93c2cp-1"),
471    h!("0x1.c9be66p-1"),
472    h!("0x1.ca40d2p-1"),
473    h!("0x1.cac36ap-1"),
474    h!("0x1.cb4634p-1"),
475    h!("0x1.cbc92ep-1"),
476    h!("0x1.cc4c56p-1"),
477    h!("0x1.cccfbp-1"),
478    h!("0x1.cd533ap-1"),
479    h!("0x1.cdd6f4p-1"),
480    h!("0x1.ce5adep-1"),
481    h!("0x1.cedefap-1"),
482    h!("0x1.cf6348p-1"),
483    h!("0x1.cfe7c6p-1"),
484    h!("0x1.d06c74p-1"),
485    h!("0x1.d0f156p-1"),
486    h!("0x1.d17668p-1"),
487    h!("0x1.d1fbacp-1"),
488    h!("0x1.d28124p-1"),
489    h!("0x1.d306ccp-1"),
490    h!("0x1.d38ca8p-1"),
491    h!("0x1.d412b6p-1"),
492    h!("0x1.d498f8p-1"),
493    h!("0x1.d51f6cp-1"),
494    h!("0x1.d5a612p-1"),
495    h!("0x1.d62ceep-1"),
496    h!("0x1.d6b3fcp-1"),
497    h!("0x1.d73b3ep-1"),
498    h!("0x1.d7c2b4p-1"),
499    h!("0x1.d84a5ep-1"),
500    h!("0x1.d8d23cp-1"),
501    h!("0x1.d95a4ep-1"),
502    h!("0x1.d9e296p-1"),
503    h!("0x1.da6b14p-1"),
504    h!("0x1.daf3c6p-1"),
505    h!("0x1.db7cacp-1"),
506    h!("0x1.dc05c8p-1"),
507    h!("0x1.dc8f1cp-1"),
508    h!("0x1.dd18a4p-1"),
509    h!("0x1.dda262p-1"),
510    h!("0x1.de2c56p-1"),
511    h!("0x1.deb682p-1"),
512    h!("0x1.df40e4p-1"),
513    h!("0x1.dfcb7ep-1"),
514    h!("0x1.e0564ep-1"),
515    h!("0x1.e0e154p-1"),
516    h!("0x1.e16c94p-1"),
517    h!("0x1.e1f80ap-1"),
518    h!("0x1.e283bap-1"),
519    h!("0x1.e30fap-1"),
520    h!("0x1.e39bcp-1"),
521    h!("0x1.e42818p-1"),
522    h!("0x1.e4b4aap-1"),
523    h!("0x1.e54174p-1"),
524    h!("0x1.e5ce76p-1"),
525    h!("0x1.e65bb4p-1"),
526    h!("0x1.e6e92ap-1"),
527    h!("0x1.e776dap-1"),
528    h!("0x1.e804c6p-1"),
529    h!("0x1.e892eap-1"),
530    h!("0x1.e9214ap-1"),
531    h!("0x1.e9afe4p-1"),
532    h!("0x1.ea3ebap-1"),
533    h!("0x1.eacdccp-1"),
534    h!("0x1.eb5d18p-1"),
535    h!("0x1.ebecap-1"),
536    h!("0x1.ec7c64p-1"),
537    h!("0x1.ed0c66p-1"),
538    h!("0x1.ed9ca2p-1"),
539    h!("0x1.ee2d1cp-1"),
540    h!("0x1.eebdd4p-1"),
541    h!("0x1.ef4ec8p-1"),
542    h!("0x1.efdffap-1"),
543    h!("0x1.f07168p-1"),
544    h!("0x1.f10316p-1"),
545    h!("0x1.f19502p-1"),
546    h!("0x1.f2272ap-1"),
547    h!("0x1.f2b994p-1"),
548    h!("0x1.f34c3ap-1"),
549    h!("0x1.f3df22p-1"),
550    h!("0x1.f47248p-1"),
551    h!("0x1.f505aep-1"),
552    h!("0x1.f59954p-1"),
553    h!("0x1.f62d3ap-1"),
554    h!("0x1.f6c16p-1"),
555    h!("0x1.f755c8p-1"),
556    h!("0x1.f7ea7p-1"),
557    h!("0x1.f87f58p-1"),
558    h!("0x1.f91484p-1"),
559    h!("0x1.f9a9fp-1"),
560    h!("0x1.fa3fap-1"),
561    h!("0x1.fad592p-1"),
562    h!("0x1.fb6bc6p-1"),
563    h!("0x1.fc023cp-1"),
564    h!("0x1.fc98f6p-1"),
565    h!("0x1.fd2ff4p-1"),
566    h!("0x1.fdc734p-1"),
567    h!("0x1.fe5ebap-1"),
568    h!("0x1.fef684p-1"),
569    h!("0x1.ff8e92p-1"),
570    h!("0x1.001372p+0"),
571    h!("0x1.005fbep+0"),
572    h!("0x1.00ac2ep+0"),
573    h!("0x1.00f8cp+0"),
574    h!("0x1.014574p+0"),
575    h!("0x1.01924cp+0"),
576    h!("0x1.01df46p+0"),
577    h!("0x1.022c66p+0"),
578    h!("0x1.0279a8p+0"),
579    h!("0x1.02c70ep+0"),
580    h!("0x1.031498p+0"),
581    h!("0x1.036246p+0"),
582    h!("0x1.03b018p+0"),
583    h!("0x1.03fe0ep+0"),
584    h!("0x1.044c2ap+0"),
585    h!("0x1.049a6ap+0"),
586    h!("0x1.04e8cep+0"),
587    h!("0x1.053758p+0"),
588    h!("0x1.058608p+0"),
589    h!("0x1.05d4dcp+0"),
590    h!("0x1.0623d6p+0"),
591    h!("0x1.0672f4p+0"),
592    h!("0x1.06c23ap+0"),
593    h!("0x1.0711a4p+0"),
594    h!("0x1.076136p+0"),
595    h!("0x1.07b0eep+0"),
596    h!("0x1.0800ccp+0"),
597    h!("0x1.0850d2p+0"),
598    h!("0x1.08a0fcp+0"),
599    h!("0x1.08f15p+0"),
600    h!("0x1.0941cap+0"),
601    h!("0x1.09926ap+0"),
602    h!("0x1.09e334p+0"),
603    h!("0x1.0a3424p+0"),
604    h!("0x1.0a853cp+0"),
605    h!("0x1.0ad67ep+0"),
606    h!("0x1.0b27e6p+0"),
607    h!("0x1.0b7976p+0"),
608    h!("0x1.0bcb3p+0"),
609    h!("0x1.0c1d14p+0"),
610    h!("0x1.0c6f1ep+0"),
611    h!("0x1.0cc154p+0"),
612    h!("0x1.0d13b2p+0"),
613    h!("0x1.0d663ap+0"),
614    h!("0x1.0db8eap+0"),
615    h!("0x1.0e0bc6p+0"),
616    h!("0x1.0e5eccp+0"),
617    h!("0x1.0eb1fap+0"),
618    h!("0x1.0f0554p+0"),
619    h!("0x1.0f58dap+0"),
620    h!("0x1.0fac8ap+0"),
621    h!("0x1.100064p+0"),
622    h!("0x1.10546ap+0"),
623    h!("0x1.10a89cp+0"),
624    h!("0x1.10fcfap+0"),
625    h!("0x1.115182p+0"),
626    h!("0x1.11a638p+0"),
627    h!("0x1.11fb1ap+0"),
628    h!("0x1.125028p+0"),
629    h!("0x1.12a564p+0"),
630    h!("0x1.12faccp+0"),
631    h!("0x1.13506p+0"),
632    h!("0x1.13a624p+0"),
633    h!("0x1.13fc14p+0"),
634    h!("0x1.145232p+0"),
635    h!("0x1.14a87ep+0"),
636    h!("0x1.14fef8p+0"),
637    h!("0x1.1555ap+0"),
638    h!("0x1.15ac78p+0"),
639    h!("0x1.16037ep+0"),
640    h!("0x1.165ab4p+0"),
641    h!("0x1.16b218p+0"),
642    h!("0x1.1709acp+0"),
643    h!("0x1.176172p+0"),
644    h!("0x1.17b966p+0"),
645    h!("0x1.18118ap+0"),
646    h!("0x1.1869ep+0"),
647    h!("0x1.18c266p+0"),
648    h!("0x1.191b1ep+0"),
649    h!("0x1.197406p+0"),
650    h!("0x1.19cd2p+0"),
651    h!("0x1.1a266cp+0"),
652    h!("0x1.1a7feap+0"),
653    h!("0x1.1ad99ap+0"),
654    h!("0x1.1b337cp+0"),
655    h!("0x1.1b8d92p+0"),
656    h!("0x1.1be7dap+0"),
657    h!("0x1.1c4256p+0"),
658    h!("0x1.1c9d06p+0"),
659    h!("0x1.1cf7e8p+0"),
660    h!("0x1.1d53p+0"),
661    h!("0x1.1dae4cp+0"),
662    h!("0x1.1e09ccp+0"),
663    h!("0x1.1e658p+0"),
664    h!("0x1.1ec16ap+0"),
665    h!("0x1.1f1d8ap+0"),
666    h!("0x1.1f79ep+0"),
667    h!("0x1.1fd66ap+0"),
668    h!("0x1.20332cp+0"),
669    h!("0x1.209024p+0"),
670    h!("0x1.20ed54p+0"),
671    h!("0x1.214abap+0"),
672    h!("0x1.21a856p+0"),
673    h!("0x1.22062cp+0"),
674    h!("0x1.226438p+0"),
675    h!("0x1.22c27ep+0"),
676    h!("0x1.2320fcp+0"),
677    h!("0x1.237fb4p+0"),
678    h!("0x1.23dea4p+0"),
679    h!("0x1.243dccp+0"),
680    h!("0x1.249d3p+0"),
681    h!("0x1.24fccep+0"),
682    h!("0x1.255ca6p+0"),
683    h!("0x1.25bcb8p+0"),
684    h!("0x1.261d06p+0"),
685    h!("0x1.267d8ep+0"),
686    h!("0x1.26de52p+0"),
687    h!("0x1.273f54p+0"),
688    h!("0x1.27a09p+0"),
689    h!("0x1.28020ap+0"),
690    h!("0x1.2863cp+0"),
691    h!("0x1.28c5b4p+0"),
692    h!("0x1.2927e6p+0"),
693    h!("0x1.298a56p+0"),
694    h!("0x1.29ed04p+0"),
695    h!("0x1.2a4ff2p+0"),
696    h!("0x1.2ab31ep+0"),
697    h!("0x1.2b1688p+0"),
698    h!("0x1.2b7a34p+0"),
699    h!("0x1.2bde1ep+0"),
700    h!("0x1.2c424ap+0"),
701    h!("0x1.2ca6b6p+0"),
702    h!("0x1.2d0b64p+0"),
703    h!("0x1.2d7054p+0"),
704    h!("0x1.2dd584p+0"),
705    h!("0x1.2e3af8p+0"),
706    h!("0x1.2ea0aep+0"),
707    h!("0x1.2f06a8p+0"),
708    h!("0x1.2f6ce6p+0"),
709    h!("0x1.2fd366p+0"),
710    h!("0x1.303a2cp+0"),
711    h!("0x1.30a134p+0"),
712    h!("0x1.310884p+0"),
713    h!("0x1.317018p+0"),
714    h!("0x1.31d7f2p+0"),
715    h!("0x1.324012p+0"),
716    h!("0x1.32a87ap+0"),
717    h!("0x1.331128p+0"),
718    h!("0x1.337a1ep+0"),
719    h!("0x1.33e35cp+0"),
720    h!("0x1.344ce2p+0"),
721    h!("0x1.34b6b2p+0"),
722    h!("0x1.3520cap+0"),
723    h!("0x1.358b2cp+0"),
724    h!("0x1.35f5d8p+0"),
725    h!("0x1.3660cep+0"),
726    h!("0x1.36cc1p+0"),
727    h!("0x1.37379ep+0"),
728    h!("0x1.37a378p+0"),
729    h!("0x1.380f9cp+0"),
730    h!("0x1.387c1p+0"),
731    h!("0x1.38e8dp+0"),
732    h!("0x1.3955dep+0"),
733    h!("0x1.39c33ap+0"),
734    h!("0x1.3a30e4p+0"),
735    h!("0x1.3a9eep+0"),
736    h!("0x1.3b0d2ap+0"),
737    h!("0x1.3b7bc4p+0"),
738    h!("0x1.3beabp+0"),
739    h!("0x1.3c59ecp+0"),
740    h!("0x1.3cc97ap+0"),
741    h!("0x1.3d395cp+0"),
742    h!("0x1.3da99p+0"),
743    h!("0x1.3e1a16p+0"),
744    h!("0x1.3e8af2p+0"),
745    h!("0x1.3efc22p+0"),
746    h!("0x1.3f6da6p+0"),
747    h!("0x1.3fdf8p+0"),
748    h!("0x1.4051b2p+0"),
749    h!("0x1.40c438p+0"),
750    h!("0x1.413716p+0"),
751    h!("0x1.41aa4cp+0"),
752    h!("0x1.421ddcp+0"),
753    h!("0x1.4291c4p+0"),
754    h!("0x1.430604p+0"),
755    h!("0x1.437aap+0"),
756    h!("0x1.43ef96p+0"),
757    h!("0x1.4464e8p+0"),
758    h!("0x1.44da96p+0"),
759    h!("0x1.4550ap+0"),
760    h!("0x1.45c708p+0"),
761    h!("0x1.463dcep+0"),
762    h!("0x1.46b4fp+0"),
763    h!("0x1.472c74p+0"),
764    h!("0x1.47a458p+0"),
765    h!("0x1.481c9ap+0"),
766    h!("0x1.48953ep+0"),
767    h!("0x1.490e46p+0"),
768    h!("0x1.4987aep+0"),
769    h!("0x1.4a017ap+0"),
770    h!("0x1.4a7baap+0"),
771    h!("0x1.4af63ep+0"),
772    h!("0x1.4b7138p+0"),
773    h!("0x1.4bec98p+0"),
774    h!("0x1.4c685ep+0"),
775    h!("0x1.4ce48cp+0"),
776    h!("0x1.4d6122p+0"),
777    h!("0x1.4dde2p+0"),
778    h!("0x1.4e5b88p+0"),
779    h!("0x1.4ed95cp+0"),
780    h!("0x1.4f579ap+0"),
781    h!("0x1.4fd644p+0"),
782    h!("0x1.50555ap+0"),
783    h!("0x1.50d4ep+0"),
784    h!("0x1.5154d2p+0"),
785    h!("0x1.51d534p+0"),
786    h!("0x1.525606p+0"),
787    h!("0x1.52d748p+0"),
788    h!("0x1.5358fcp+0"),
789    h!("0x1.53db24p+0"),
790    h!("0x1.545dbep+0"),
791    h!("0x1.54e0ccp+0"),
792    h!("0x1.55645p+0"),
793    h!("0x1.55e84ap+0"),
794    h!("0x1.566cbap+0"),
795    h!("0x1.56f1a2p+0"),
796    h!("0x1.577702p+0"),
797    h!("0x1.57fcdep+0"),
798    h!("0x1.588332p+0"),
799    h!("0x1.590a02p+0"),
800    h!("0x1.59915p+0"),
801    h!("0x1.5a191ap+0"),
802    h!("0x1.5aa164p+0"),
803    h!("0x1.5b2a2cp+0"),
804    h!("0x1.5bb374p+0"),
805    h!("0x1.5c3d4p+0"),
806    h!("0x1.5cc78cp+0"),
807    h!("0x1.5d525cp+0"),
808    h!("0x1.5dddb2p+0"),
809    h!("0x1.5e698cp+0"),
810    h!("0x1.5ef5eep+0"),
811    h!("0x1.5f82d6p+0"),
812    h!("0x1.601048p+0"),
813    h!("0x1.609e44p+0"),
814    h!("0x1.612cccp+0"),
815    h!("0x1.61bbep+0"),
816    h!("0x1.624b8p+0"),
817    h!("0x1.62dbbp+0"),
818    h!("0x1.636c7p+0"),
819    h!("0x1.63fdcp+0"),
820    h!("0x1.648fa4p+0"),
821    h!("0x1.65221ap+0"),
822    h!("0x1.65b526p+0"),
823    h!("0x1.6648c6p+0"),
824    h!("0x1.66ddp+0"),
825    h!("0x1.6771d2p+0"),
826    h!("0x1.68073cp+0"),
827    h!("0x1.689d44p+0"),
828    h!("0x1.6933e6p+0"),
829    h!("0x1.69cb28p+0"),
830    h!("0x1.6a6308p+0"),
831    h!("0x1.6afb8ap+0"),
832    h!("0x1.6b94aep+0"),
833    h!("0x1.6c2e74p+0"),
834    h!("0x1.6cc8e2p+0"),
835    h!("0x1.6d63f4p+0"),
836    h!("0x1.6dffbp+0"),
837    h!("0x1.6e9c14p+0"),
838    h!("0x1.6f3926p+0"),
839    h!("0x1.6fd6e2p+0"),
840    h!("0x1.70754ep+0"),
841    h!("0x1.711468p+0"),
842    h!("0x1.71b436p+0"),
843    h!("0x1.7254b6p+0"),
844    h!("0x1.72f5eap+0"),
845    h!("0x1.7397d6p+0"),
846    h!("0x1.743a7ap+0"),
847    h!("0x1.74ddd8p+0"),
848    h!("0x1.7581f2p+0"),
849    h!("0x1.7626cap+0"),
850    h!("0x1.76cc6p+0"),
851    h!("0x1.7772b8p+0"),
852    h!("0x1.7819d4p+0"),
853    h!("0x1.78c1b6p+0"),
854    h!("0x1.796a5cp+0"),
855    h!("0x1.7a13cep+0"),
856    h!("0x1.7abe0ap+0"),
857    h!("0x1.7b6912p+0"),
858    h!("0x1.7c14eap+0"),
859    h!("0x1.7cc194p+0"),
860    h!("0x1.7d6f1p+0"),
861    h!("0x1.7e1d62p+0"),
862    h!("0x1.7ecc8cp+0"),
863    h!("0x1.7f7c8ep+0"),
864    h!("0x1.802d6ep+0"),
865    h!("0x1.80df2cp+0"),
866    h!("0x1.8191cap+0"),
867    h!("0x1.82454ap+0"),
868    h!("0x1.82f9b2p+0"),
869    h!("0x1.83afp+0"),
870    h!("0x1.846538p+0"),
871    h!("0x1.851c5ep+0"),
872    h!("0x1.85d474p+0"),
873    h!("0x1.868d7ap+0"),
874    h!("0x1.874776p+0"),
875    h!("0x1.880268p+0"),
876    h!("0x1.88be54p+0"),
877    h!("0x1.897b3ep+0"),
878    h!("0x1.8a3928p+0"),
879    h!("0x1.8af812p+0"),
880    h!("0x1.8bb802p+0"),
881    h!("0x1.8c78fcp+0"),
882    h!("0x1.8d3bp+0"),
883    h!("0x1.8dfe12p+0"),
884    h!("0x1.8ec234p+0"),
885    h!("0x1.8f876cp+0"),
886    h!("0x1.904dbcp+0"),
887    h!("0x1.911528p+0"),
888    h!("0x1.91ddbp+0"),
889    h!("0x1.92a75cp+0"),
890    h!("0x1.93722cp+0"),
891    h!("0x1.943e24p+0"),
892    h!("0x1.950b4ap+0"),
893    h!("0x1.95d99ep+0"),
894    h!("0x1.96a926p+0"),
895    h!("0x1.9779e6p+0"),
896    h!("0x1.984be2p+0"),
897    h!("0x1.991f1cp+0"),
898    h!("0x1.99f398p+0"),
899    h!("0x1.9ac95cp+0"),
900    h!("0x1.9ba06cp+0"),
901    h!("0x1.9c78ccp+0"),
902    h!("0x1.9d527ep+0"),
903    h!("0x1.9e2d8ap+0"),
904    h!("0x1.9f09fp+0"),
905    h!("0x1.9fe7bap+0"),
906    h!("0x1.a0c6e8p+0"),
907    h!("0x1.a1a782p+0"),
908    h!("0x1.a2898ap+0"),
909    h!("0x1.a36d08p+0"),
910    h!("0x1.a451fep+0"),
911    h!("0x1.a53872p+0"),
912    h!("0x1.a6206ap+0"),
913    h!("0x1.a709ecp+0"),
914    h!("0x1.a7f4fcp+0"),
915    h!("0x1.a8e1ap+0"),
916    h!("0x1.a9cfdcp+0"),
917    h!("0x1.aabfbap+0"),
918    h!("0x1.abb13cp+0"),
919    h!("0x1.aca46ap+0"),
920    h!("0x1.ad994ap+0"),
921    h!("0x1.ae8fep+0"),
922    h!("0x1.af8836p+0"),
923    h!("0x1.b08252p+0"),
924    h!("0x1.b17e38p+0"),
925    h!("0x1.b27bf2p+0"),
926    h!("0x1.b37b84p+0"),
927    h!("0x1.b47cf8p+0"),
928    h!("0x1.b58054p+0"),
929    h!("0x1.b685ap+0"),
930    h!("0x1.b78ce4p+0"),
931    h!("0x1.b89628p+0"),
932    h!("0x1.b9a172p+0"),
933    h!("0x1.baaeccp+0"),
934    h!("0x1.bbbe4p+0"),
935    h!("0x1.bccfd4p+0"),
936    h!("0x1.bde392p+0"),
937    h!("0x1.bef982p+0"),
938    h!("0x1.c011bp+0"),
939    h!("0x1.c12c24p+0"),
940    h!("0x1.c248e8p+0"),
941    h!("0x1.c36804p+0"),
942    h!("0x1.c48986p+0"),
943    h!("0x1.c5ad76p+0"),
944    h!("0x1.c6d3e2p+0"),
945    h!("0x1.c7fcdp+0"),
946    h!("0x1.c9285p+0"),
947    h!("0x1.ca566cp+0"),
948    h!("0x1.cb873p+0"),
949    h!("0x1.ccbaaap+0"),
950    h!("0x1.cdf0e4p+0"),
951    h!("0x1.cf29eep+0"),
952    h!("0x1.d065d2p+0"),
953    h!("0x1.d1a4a2p+0"),
954    h!("0x1.d2e66ap+0"),
955    h!("0x1.d42b3ap+0"),
956    h!("0x1.d5731ep+0"),
957    h!("0x1.d6be2ap+0"),
958    h!("0x1.d80c6ap+0"),
959    h!("0x1.d95df2p+0"),
960    h!("0x1.dab2dp+0"),
961    h!("0x1.dc0b18p+0"),
962    h!("0x1.dd66dcp+0"),
963    h!("0x1.dec62cp+0"),
964    h!("0x1.e0291ep+0"),
965    h!("0x1.e18fc4p+0"),
966    h!("0x1.e2fa34p+0"),
967    h!("0x1.e46882p+0"),
968    h!("0x1.e5dac6p+0"),
969    h!("0x1.e75114p+0"),
970    h!("0x1.e8cb84p+0"),
971    h!("0x1.ea4a3p+0"),
972    h!("0x1.ebcd3p+0"),
973    h!("0x1.ed549cp+0"),
974    h!("0x1.eee092p+0"),
975    h!("0x1.f0712cp+0"),
976    h!("0x1.f20688p+0"),
977    h!("0x1.f3a0c2p+0"),
978    h!("0x1.f53ffap+0"),
979    h!("0x1.f6e452p+0"),
980    h!("0x1.f88de8p+0"),
981    h!("0x1.fa3ce2p+0"),
982    h!("0x1.fbf162p+0"),
983    h!("0x1.fdab8cp+0"),
984    h!("0x1.ff6b8cp+0"),
985    h!("0x1.0098c2p+1"),
986    h!("0x1.017ed2p+1"),
987    h!("0x1.02680cp+1"),
988    h!("0x1.035484p+1"),
989    h!("0x1.044454p+1"),
990    h!("0x1.053796p+1"),
991    h!("0x1.062e62p+1"),
992    h!("0x1.0728d4p+1"),
993    h!("0x1.082708p+1"),
994    h!("0x1.09291ep+1"),
995    h!("0x1.0a2f34p+1"),
996    h!("0x1.0b396ap+1"),
997    h!("0x1.0c47e4p+1"),
998    h!("0x1.0d5ac4p+1"),
999    h!("0x1.0e723p+1"),
1000    h!("0x1.0f8e54p+1"),
1001    h!("0x1.10af54p+1"),
1002    h!("0x1.11d56p+1"),
1003    h!("0x1.1300a4p+1"),
1004    h!("0x1.143154p+1"),
1005    h!("0x1.1567a2p+1"),
1006    h!("0x1.16a3c6p+1"),
1007    h!("0x1.17e5f8p+1"),
1008    h!("0x1.192e78p+1"),
1009    h!("0x1.1a7d84p+1"),
1010    h!("0x1.1bd364p+1"),
1011    h!("0x1.1d306p+1"),
1012    h!("0x1.1e94c8p+1"),
1013    h!("0x1.2000eep+1"),
1014    h!("0x1.21752ap+1"),
1015    h!("0x1.22f1dep+1"),
1016    h!("0x1.24777p+1"),
1017    h!("0x1.26064ap+1"),
1018    h!("0x1.279ee4p+1"),
1019    h!("0x1.2941bep+1"),
1020    h!("0x1.2aef5cp+1"),
1021    h!("0x1.2ca854p+1"),
1022    h!("0x1.2e6d46p+1"),
1023    h!("0x1.303edcp+1"),
1024    h!("0x1.321dd2p+1"),
1025    h!("0x1.340af8p+1"),
1026    h!("0x1.36072ap+1"),
1027    h!("0x1.38135cp+1"),
1028    h!("0x1.3a30ap+1"),
1029    h!("0x1.3c6018p+1"),
1030    h!("0x1.3ea30ep+1"),
1031    h!("0x1.40faeep+1"),
1032    h!("0x1.43694cp+1"),
1033    h!("0x1.45efeap+1"),
1034    h!("0x1.4890c4p+1"),
1035    h!("0x1.4b4e16p+1"),
1036    h!("0x1.4e2a68p+1"),
1037    h!("0x1.51289cp+1"),
1038    h!("0x1.544c02p+1"),
1039    h!("0x1.57986ap+1"),
1040    h!("0x1.5b1246p+1"),
1041    h!("0x1.5ebec6p+1"),
1042    h!("0x1.62a41p+1"),
1043    h!("0x1.66c97ap+1"),
1044    h!("0x1.6b37dep+1"),
1045    h!("0x1.6ffa12p+1"),
1046    h!("0x1.751d8p+1"),
1047    h!("0x1.7ab31cp+1"),
1048    h!("0x1.80d0aep+1"),
1049    h!("0x1.8792eap+1"),
1050    h!("0x1.8f20aep+1"),
1051    h!("0x1.97b078p+1"),
1052    h!("0x1.a19214p+1"),
1053    h!("0x1.ad413cp+1"),
1054    h!("0x1.bb8d3ap+1"),
1055    h!("0x1.cdfa9cp+1"),
1056    h!("0x1.e7f1c2p+1"),
1057    h!("0x1.0a2924p+2"),
1058];
1059
1060pub fn cr_atanhf16(x: f16) -> f16 {
1061    let v = f32::from(x);
1062    let u = v.to_bits();
1063    let au = u & 0x7fffffff;
1064
1065    if au >= 0x3f800000 {
1066        // NaN or Inf or |x| >= 1
1067        if au == 0x3f800000 {
1068            // |x| = 1
1069            return if au == u {
1070                f16::INFINITY
1071            } else {
1072                f16::NEG_INFINITY
1073            };
1074        }
1075        if au > 0x7f800000 {
1076            // NaN
1077            return x + x;
1078        }
1079        return snanf16();
1080    }
1081
1082    // now |x| < 1
1083
1084    let t = v;
1085
1086    // for x < 0 we use atanh(-x) = -atanh(x)
1087    let neg = (u >> 31) != 0;
1088    const NEG: [f32; 2] = [1.0, -1.0];
1089    let s = NEG[usize::from(neg)];
1090
1091    if au >= 0x3f000000 {
1092        // |x| >= 1/2
1093        let i = (au - 0x3f000000) >> 13;
1094        return (s * T1[i as usize]) as f16;
1095    }
1096
1097    // now 0 <= t < 1/2
1098
1099    /* for |x| <= 0x1.d1p-6, atanh(x) rounds to x to nearest */
1100    if au <= 0x3ce88000 {
1101        // |x| <= 0x1.d1p-6
1102        if au == 0 {
1103            return x; // +/-0
1104        }
1105        return f32::mul_add(t, h!("0x1p-12"), t) as f16;
1106    }
1107
1108    // deal with one exception
1109    if au == 0x3da78000 {
1110        return (s * h!("0x1.4fbffep-4")) as f16; // |x|=0x1.4fp-4
1111    }
1112
1113    /* p is a degree-11 polynomial with odd-degree coefficients approximating
1114    atanh(x) on [0,1/2], generated by Sollya (cf atanh.sollya), and
1115    optimized to reduce exceptions */
1116    const P: [f32; 6] = [
1117        h!("0x1.000004p+0"),
1118        h!("0x1.55558ep-2"),
1119        h!("0x1.997ceep-3"),
1120        h!("0x1.2785fcp-3"),
1121        h!("0x1.871ffp-4"),
1122        h!("0x1.43b244p-3"),
1123    ];
1124    let tt = t * t;
1125    let c9 = f32::mul_add(P[5], tt, P[4]); // degree 9
1126    let mut c5 = f32::mul_add(P[3], tt, P[2]); // degree 5
1127    let mut c1 = f32::mul_add(P[1], tt, P[0]); // degree 1
1128    c5 = f32::mul_add(c9, tt * tt, c5);
1129    c1 = f32::mul_add(c5, tt * tt, c1);
1130    (t * c1) as f16
1131}
1132
1133#[cfg(test)]
1134mod tests {
1135    #[test]
1136    fn exhaustive() {
1137        for b in 0..=u16::MAX {
1138            let x = f16::from_bits(b);
1139            let y1 = super::cr_atanhf16(x);
1140            let y2 = core_math::atanhf16(x);
1141            assert_eq!(
1142                y1.to_bits(),
1143                y2.to_bits(),
1144                "atanhf16({x} @ {b:#04x}) = ({y1} @ {y1b:#04x}) vs ({y2} @ {y2b:#04x})",
1145                y1b = y1.to_bits(),
1146                y2b = y2.to_bits()
1147            );
1148        }
1149    }
1150
1151    #[test]
1152    fn edge() {
1153        assert_eq!(
1154            super::cr_atanhf16(-f16::NAN).to_bits(),
1155            (-f16::NAN).to_bits()
1156        );
1157        assert_eq!(
1158            super::cr_atanhf16(-f16::INFINITY).to_bits(),
1159            super::snanf16().to_bits() // FIXME: sign
1160        );
1161        assert_eq!(super::cr_atanhf16(-0.0).to_bits(), (-0.0_f16).to_bits());
1162        assert_eq!(super::cr_atanhf16(0.0).to_bits(), (0.0_f16).to_bits());
1163        assert_eq!(
1164            super::cr_atanhf16(f16::INFINITY).to_bits(),
1165            super::snanf16().to_bits() // FIXME: sign
1166        );
1167        assert_eq!(super::cr_atanhf16(f16::NAN).to_bits(), (f16::NAN).to_bits());
1168    }
1169}