aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorMohamed Emad <hulxxv@gmail.com>2025-09-02 22:50:50 +0300
committerGitHub <noreply@github.com>2025-09-02 22:50:50 +0300
commitc1d1e0e32fcd8f457a1644a5859d23155ca666ac (patch)
treede1fe682bcbe687ce0ac3480b12e3e56b72a0c7a /clang/lib/CodeGen/CodeGenModule.cpp
parent51163c5dbdea72139ee4b93f5de7e652d30dea9f (diff)
downloadllvm-c1d1e0e32fcd8f457a1644a5859d23155ca666ac.zip
llvm-c1d1e0e32fcd8f457a1644a5859d23155ca666ac.tar.gz
llvm-c1d1e0e32fcd8f457a1644a5859d23155ca666ac.tar.bz2
[libc][math][c23] Implement C23 math function atanpif16 (#150400)
This PR implements `atanpif16(x)` which computes $\frac{\arctan(x)}{\pi}$ for half-precision floating-point numbers using polynomial approximation with domain reduction. ## Mathematical Implementation The implementation uses a 15th-degree Taylor polynomial expansion of $\frac{\arctan(x)}{\pi}$ that's computed using [`python-sympy`](https://www.sympy.org/en/index.html) and it's accurate in $|x| \in [0, 0.5)$: $$ g(x) = \frac{\arctan(x)}{\pi} \approx \begin{aligned}[t] & 0.318309886183791x \\ & - 0.106103295394597x^3 \\ & + 0.0636619772367581x^5 \\ & - 0.0454728408833987x^7 \\ & + 0.0353677651315323x^9 \\ & - 0.0289372623803446x^{11} \\ & + 0.0244853758602916x^{13} \\ & - 0.0212206590789194x^{15} + O(x^{17}) \end{aligned} $$ --- To ensure accuracy across all real inputs, the domain is divided into three cases with appropriate transformations: **Case 1: $|x| \leq 0.5$** Direct polynomial evaluation: $$\text{atanpi}(x) = \text{sign}(x) \cdot g(|x|)$$ **Case 2: $0.5 < |x| \leq 1$** Double-angle reduction using: $$\arctan(x) = 2\arctan\left(\frac{x}{1 + \sqrt{1 + x^2}}\right)$$ $$\text{atanpi}(x) = \text{sign}(x) \cdot 2g\left(\frac{|x|}{1 + \sqrt{1 + x^2}}\right)$$ **Case 3: $|x| > 1$** Reciprocal transformation using $$\arctan(x) = \frac{\pi}{2} - \arctan\left(\frac{1}{x}\right) \ \text{for} \ x \gt 0$$ $$\text{atanpi}(x) = \text{sign}(x) \cdot \left(\frac{1}{2} - g\left(\frac{1}{|x|}\right)\right)$$ Closes #132212
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
0 files changed, 0 insertions, 0 deletions