<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/120573>120573</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            `__builtin_cos` loses accuracy as doubles gain precision
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            bug,
            clang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          cjdb
      </td>
    </tr>
</table>

<pre>
    Given
```cpp
std::println("{}", __builtin_cos(1.5));
std::println("{}", __builtin_cos(1.57));
std::println("{}", __builtin_cos(1.570));
std::println("{}", __builtin_cos(1.5707));
std::println("{}", __builtin_cos(1.57079));
std::println("{}", __builtin_cos(1.570796));
std::println("{}", __builtin_cos(1.5707963));
std::println("{}", __builtin_cos(1.57079632));
std::println("{}", __builtin_cos(1.570796326));
std::println("{}", __builtin_cos(1.5707963267));
std::println("{}", __builtin_cos(1.57079632679));
std::println("{}", __builtin_cos(1.570796326794));
std::println("{}", __builtin_cos(1.5707963267948));
std::println("{}", __builtin_cos(1.57079632679489));
std::println("{}", __builtin_cos(1.570796326794896));
std::println("{}", __builtin_cos(1.5707963267948966));
```
we get the output
```
0.0707372016677029 // WolframAlpha: 0.0707372
0.0007963267107332633 // WolframAlpha: 0.000796327
0.0007963267107332633 // WolframAlpha: 0.000796327
9.632679474766714e-05 // WolframAlpha: 9.63268 × 10^-5
6.326794896668469e-06 // WolframAlpha: 6.32679 × 10^-6
3.2679489653813835e-07 // WolframAlpha: 3.26795 × 10^-7
2.6794896585028633e-08 // WolframAlpha: 2.67949 × 10^-8
6.794896706578056e-09 // WolframAlpha: 6.79490 × 10^-9
7.948966542250398e-10 // WolframAlpha: 7.94897 × 10^-10
9.489659630678013e-11 // WolframAlpha: 9.48966 × 10^-11
4.8965888601467475e-12 // WolframAlpha: 4.89662 × 10^-12
8.966773470272338e-13 // WolframAlpha: 8.96619 × 10^-13
9.665063548234599e-14 // WolframAlpha: 9.66192 × 10^-14
6.722570487708307e-15 // WolframAlpha: 6.61923 × 10^-15
7.273661547324616e-16 // WolframAlpha: 6.19231 × 10^-16
6.123233995736766e-17 // WolframAlpha: 1.92313 × 10^-17
```
Things start to get a bit wobbly at 14 decimal points, and very wrong thereafter.

This was originally noticed by the following program:
```cpp
#include <complex>
#include <iostream>

int main() {
  auto const c = std::sqrt(std::complex<float>(-4.0f, 0.0f));
  auto const z = std::sqrt(std::complex<double>(-4.0, 0.0));
  std::cout << c << z << '\n';
}
```
which gives the output
```
(-8.74228e-08,2)(1.22465e-16,2)
```

I was then able to trace this to `__builtin_cos` by playing with the implementation of `std::sqrt(std::complex<T>)`.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysl82O2zYQx5-GvhASyOGnDj4o3mzRe4AeA0qmZQa06IrUbp2nL0itd2unDoJWgABJq5kf5-O_Q9rE6IbR2i0Sn5B42pg5HcO07b_tu00X9pftb-7Fjoi0SJLl6s9nRNqY9oi1iLXnyY3Jjwg0AkDqE1JP-QF2-OvXbnY-ufFrHyICTWuBoMkX-_SfCWoFBFmDsUogqlmHIlfCsLU4sBpotdRArtSyglqrcYXFV4XpdWnrZqrX0-qVdwN8H1OItK8WDzbhdLQ4zOk8p7vvpCaKKKaAUCmVItBgBM8InvEfwR8mc2r9-WgQa_G75eJFrutTohgDydhPHN-M1f9zbeq3hBVXUirKbUXEI9fFWGO0Y6hRmBIkPlcCkVbWH1WTmsvGVkQ-orwZ31IkIi2rrxDBNGWaCVsR9QizWItbTE4J6itFCwJaMmYroh9hFuu7aHTJaaEoIoXSREhbkYeNLMYNuaU0iLSqXqoiOIAgrNG2ouQRZTFWtxRKSptKQo1kRCpNKLMVpY_bVJa8w1BEWl6XsmgtCeVScSVsReERp1hLuONkreq6ycpmXBFQwFjO6qHgijG9qzBli_ikIJIJroFx0TS2ovwn4pO0uY-GL50CEIpwrRTRjChb0YcalnWmsDuMKK0CxaSkgisGXFJpK_oTEWcKvcPIEg0FBow1jVBMKpkxD0VM60y5j0bdDZQvRzcOEcdkpoRTKNPH4M4l_Bq6zl-wSZhyvLe9OxmPz8GNKeYZZ8Y9frHTBb9OYRzyxJqsOSQ71XmFAo741UQcJje40Xh_wWNIrrd73F3KhDsE78OrGwd8nsIwmVOeqz8c2xAwN_Z-3luM2K4Pp7O3fyH2-YdPLsQ02Uz5vITgxoRPxi0TusF5RJMWYzOngPswxoR7jNgTfp_o8c8pIdDv7--L7Q4-mJTBoCtek0OuACn3jzl-Q_7-q-R9mDtvP9Bv5FvwP_zmlHNFbFeCLw_frw8IFBK7Md-WnUU93e8vR9cf8eBebHy8yeRIdK04gM7jDcFuORtpWgNwmf-x5fWPd56k_b00PR3tiE3nbdZUmkxvccqCSAEjSW73R0myIM7eXLIUXl06ltBcrtDJjskkF0YcDtnzFwr6pdSyQZLUm_2W7RvWmI3dUsW4pIxLuTlumbWMHjpjDJVCWtNLSxurQateULvXG7cFApwCbSgjHHitDr2WrAdmets3B4U4sSfjfO39y6kO07BxMc52S4EIxTbedNbH8gsFoJuH5WCAAHpvxvImnjbTNjtX3TxExIl3McUPXHLJ2-2_FcuHaCM2fT9Ppr9gE_GioYgH40Z8nmzvogvjZp789pjSOeYSlSExuHScu7oPJwTPeam3W3WewjfbJwTPJY2I4Pktk5ct_B0AAP__5KuXzg">